Как проверить, существует ли команда оболочки из 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');
}
Существуют ли какие-либо решения?
Ответы
Ответ 1
В 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');
}
Update:
Как предложил @camilo-martin, вы можете просто использовать:
if (`which makemiracle`) {
shell_exec('makemiracle');
}
Ответ 2
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;
}
Ответ 3
Вы можете использовать is_executable, чтобы проверить, является ли он исполняемым, но вам нужно знать путь к команде, которую вы могли бы использовать which
, чтобы получить его.
Ответ 4
Независимое от платформы решение:
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;
}
Ответ 5
Основано на ответе @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")));
}
Ответ 6
function checkIfCommandExists($cmd){
$prefix = strpos(strtolower(PHP_OS),'win') > -1 ? 'where' : 'which';
exec("{$prefix} {$cmd}", $output, $returnVal);
$returnVal !== 0
}
это кроссплатформенное решение с использованием возвращаемого значения "where" и "which":)
Ответ 7
Нет, нет.
Даже если у вас есть прямой доступ к оболочке, вы не знаете, существует ли команда. Там есть некоторые трюки типа wheris
или find / -name yourcommand
, но это не 100% гарантия того, что вы можете выполнить команду.