Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if a shell command exists from PHP

Tags:

linux

php

exec

I need something like this in 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');
}

Are there any solutions?

like image 793
mimrock Avatar asked Sep 14 '12 12:09

mimrock


4 Answers

On Linux/Mac OS Try this:

function command_exist($cmd) {
    $return = shell_exec(sprintf("which %s", escapeshellarg($cmd)));
    return !empty($return);
}

Then use it in code:

if (!command_exist('makemiracle')) {
    print 'no miracles';
} else {
    shell_exec('makemiracle');
}

Update: As suggested by @camilo-martin you could simply use:

if (`which makemiracle`) {
    shell_exec('makemiracle');
}
like image 98
docksteaderluke Avatar answered Oct 22 '22 15:10

docksteaderluke


Windows uses where, UNIX systems which to allow to localize a command. Both will return an empty string in STDOUT if the command isn't found.

PHP_OS is currently WINNT for every supported Windows version by PHP.

So here a portable solution:

/**
 * 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;
}
like image 27
Dereckson Avatar answered Oct 22 '22 14:10

Dereckson


Based on @jcubic and that 'which' should be avoided, this is the cross platform I came up with:

function verifyCommand($command) :bool {
  $windows = strpos(PHP_OS, 'WIN') === 0;
  $test = $windows ? 'where' : 'command -v';
  return is_executable(trim(shell_exec("$test $command")));
}
like image 8
botris Avatar answered Oct 22 '22 13:10

botris


You could use is_executable to check whether it is executable, but you need to know the path of the command, which you could use which command to get it.

like image 4
xdazz Avatar answered Oct 22 '22 14:10

xdazz