GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So überprüfen Sie, ob ein Shell-Befehl von PHP existiert

Windows verwendet where , UNIX-Systeme which um einen Befehl lokalisieren zu können. Beide geben einen leeren String in STDOUT zurück, wenn der Befehl nicht gefunden wird.

PHP_OS ist derzeit WINNT für jede von PHP unterstützte Windows-Version.

Also hier eine portable Lösung:

/**
 * 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;
}

Unter Linux/Mac OS Versuchen Sie Folgendes:

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

Dann verwenden Sie es im Code:

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

Aktualisierung: Wie von @camilo-martin vorgeschlagen, könnten Sie einfach Folgendes verwenden:

if (`which makemiracle`) {
    shell_exec('makemiracle');
}

Basierend auf @jcubic und dem, was vermieden werden sollte, ist dies die plattformübergreifende Idee, die ich mir ausgedacht habe:

function verifyCommand($command) :bool {
  $windows = strpos(PHP_OS, 'WIN') === 0;
  $test = $windows ? 'where' : 'command -v';
  return is_executable(trim(shell_exec("$test $command")));
}

Linux
  1. Wie lösche ich die ersten/letzten 'n' Zeilen aus der Befehlsausgabe in der Shell?

  2. Wie stellt man einen Hintergrundjob aus einer früheren Shell wieder her?

  3. So überprüfen Sie die Ubuntu-Version über die Befehlszeile

  4. Wie kann ich überprüfen, ob eine Datei vorhanden ist, und einen Befehl ausführen, wenn dies nicht der Fall ist?

  5. Wie führe ich externe Shell-Befehle vom Laravel-Controller aus?

So führen Sie einen Shell-Befehl mit Python aus

So überprüfen Sie Wetterdetails von der Befehlszeile in Linux

So überprüfen Sie die Linux-Netzwerkstatistik über die Befehlszeile

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in der Bash-Shell vorhanden ist

Wie führe ich einen Befehl in einem Shell-Skript aus?

Wie überprüfe ich die Inode-Nutzung über cPanel und die Befehlszeile?