Мне нужно что-то подобное в 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 в настоящее время WINNT для каждой поддерживаемой версии Windows PHP.
Итак, вот портативное решение:
/** * 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, чтобы проверить, является ли он исполняемым, но вам нужно знать путь к команде, с помощью которой вы можете использовать эту команду для ее получения.
Независимое от платформы решение:
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 }
это кроссплатформенное решение, использующее возвращаемое значение «где» и «которое» ðŸ™‚
Нет, здесь нету.
Даже имея прямой доступ к оболочке, вы не знаете, существует ли команда. Там есть некоторые трюки вроде wheris
или find / -name yourcommand
но это не 100% гарантия того, что вы можете выполнить команду.