GNU/Linux >> Linux の 問題 >  >> Linux

PHPからシェルコマンドが存在するかどうかを確認する方法

Windows は where を使用します 、UNIX システム which コマンドをローカライズできるようにします。コマンドが見つからない場合、どちらも STDOUT に空の文字列を返します。

PHP_OS は現在、PHP がサポートするすべての Windows バージョンで WINNT です。

ここに移植可能なソリューションがあります:

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

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');
}

@jcubic と 'which' を避けるべきという意見に基づいて、これが私が思いついたクロス プラットフォームです:

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. Linuxシステムが32ビットか64ビットかを確認する方法

  2. シェルのコマンド出力から最初/最後の「n」行を削除するにはどうすればよいですか?

  3. ファイルの存在を確認し、存在しない場合はコマンドを実行するにはどうすればよいですか?

  1. コマンドラインからPHPでロードまたは有効化されたモジュールを一覧表示する方法

  2. Linux シェル スクリプトでグループが存在するかどうかを確認し、存在しない場合は追加する方法

  3. laravelコントローラーから外部シェルコマンドを実行するには?

  1. 以前のシェルからバックグラウンドジョブを回復する方法は??

  2. PHPを5.3.xから5.2.xにダウングレードする方法は?

  3. コマンドラインからUbuntuのバージョンを確認する方法