Intereting Posts

Как проверить, существует ли команда оболочки из PHP

Мне нужно что-то подобное в 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% гарантия того, что вы можете выполнить команду.