我需要在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系统来允许本地化一个命令。 如果找不到命令,两者都会在STDOUT中返回一个空字符串。
PHP_OS目前每个受支持的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; }
您可以使用is_executable来检查它是否可执行,但是您需要知道命令的路径,您可以使用which
命令来获取它。
平台独立解决方案
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; }
function checkIfCommandExists($cmd){ $prefix = strpos(strtolower(PHP_OS),'win') > -1 ? 'where' : 'which'; exec("{$prefix} {$cmd}", $output, $returnVal); $returnVal !== 0 }
这是一个使用“where”和“which”的返回值的跨平台解决方案:)
不是,没有。
即使直接访问shell,也不知道是否存在命令。 有一些像wheris
这样的wheris
或find / -name yourcommand
但不是100%保证你可以执行命令。