我在php中需要这样的东西:
If (!command_exists('makemiracle')) {
print 'no miracles';
return FALSE;
}
else {
// safely call the command knowing that it exists in the host system
shell_exec('makemiracle');
}
有什么解决办法吗?
在 Linux/Mac OS 上试试这个:
function command_exist($cmd) {
$return = shell_exec(sprintf("which %s", escapeshellarg($cmd)));
return !empty($return);
}
然后在代码中使用它:
if (!command_exist('makemiracle')) {
print 'no miracles';
} else {
shell_exec('makemiracle');
}
更新: 正如@camilo-martin 所建议的,您可以简单地使用:
if (`which makemiracle`) {
shell_exec('makemiracle');
}
Windows 使用where
、UNIX 系统which
允许本地化命令。如果找不到该命令,两者都将在 STDOUT 中返回一个空字符串。
PHP_OS 当前是 PHP 支持的每个 Windows 版本的 WINNT。
所以这里有一个便携式解决方案:
/**
* Determines if a command exists on the current environment
*
* @param string $command The command to check
* @return bool True if the command has been found ; otherwise, false.
*/
function command_exists ($command) {
$whereIsCommand = (PHP_OS == 'WINNT') ? 'where' : 'which';
$process = proc_open(
"$whereIsCommand $command",
array(
0 => array("pipe", "r"), //STDIN
1 => array("pipe", "w"), //STDOUT
2 => array("pipe", "w"), //STDERR
),
$pipes
);
if ($process !== false) {
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
return $stdout != '';
}
return false;
}
基于@jcubic和应该避免的'which',这是我想出的跨平台:
function verifyCommand($command) :bool {
$windows = strpos(PHP_OS, 'WIN') === 0;
$test = $windows ? 'where' : 'command -v';
return is_executable(trim(shell_exec("$test $command")));
}
您可以使用is_executable 来检查它是否可执行,但您需要知道命令的路径,您可以使用which
command 来获取它。
平台独立解决方案:
function cmd_exists($command)
{
if (\strtolower(\substr(PHP_OS, 0, 3)) === 'win')
{
$fp = \popen("where $command", "r");
$result = \fgets($fp, 255);
$exists = ! \preg_match('#Could not find files#', $result);
\pclose($fp);
}
else # non-Windows
{
$fp = \popen("which $command", "r");
$result = \fgets($fp, 255);
$exists = ! empty($result);
\pclose($fp);
}
return $exists;
}
基于@xdazz 的回答,适用于 Windows 和 Linux。也应该在 MacOSX 上工作,因为它是 unix。
function is_windows() {
return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
}
function command_exists($command) {
$test = is_windows() ? "where" : "which";
return is_executable(trim(shell_exec("$test $command")));
}
不是,没有。
即使直接访问 shell,您也不知道命令是否存在。有一些技巧,例如wheris
orfind / -name yourcommand
但不是 100% 保证您可以执行命令。