コマンドが Bash に存在するかどうかを確認する

Faiq Bilal 2023年6月20日
  1. command -v コマンドを使用して、コマンドが Bash に存在するかどうかを確認する
  2. type コマンドを使用して、コマンドが Bash に存在するかどうかを確認する
  3. hash コマンドを使用してコマンドが Bash に存在するかどうかを確認する
  4. test コマンドを使用してコマンドが Bash に存在するかどうかを確認する
コマンドが Bash に存在するかどうかを確認する

Bash スクリプトまたはプログラミングを使用して、コマンド、プログラム、またはファイルが存在するかどうかを検証する必要がある場合があります。 この記事では、そのニーズを満たすための複数の方法を紹介します。

Bash では、コマンドが存在するかどうかを確認できるさまざまな組み込みコマンドを使用できます。 これらのコマンドの使用法を以下に示します。

command -v コマンドを使用して、コマンドが Bash に存在するかどうかを確認する

command -v は、すべての POSIX システムと Bash に組み込まれている関数です。 この関数は、コマンドが存在する場合はそのコマンドの有効なパスを返し、存在しない場合は NULL を返すため、コマンドが存在するかどうかを確認します。

例えば:

command -v ls

出力:

/bin/ls

command -v を Bash スクリプトで安全に使用して、if 条件付きのコマンドの存在を確認することもできます。これについては、以下で説明します。

if ! [ -x "$(command -v npm)" ]; then
  echo 'Error: npm is not installed.' >&2
  exit 1
fi

上記のコードは、npm がインストールされているかどうか、つまり、ユーザー ディレクトリ内に存在するかどうか、および実行可能かどうかを確認します。 Pathnpm が見つからない場合、上記のコードは例外を発生させて終了します。

上記のテンプレートを使用して、そのプログラム/コマンド/ユーティリティの名前を使用して、プログラム/コマンド/ユーティリティの存在を確認できます。

type コマンドを使用して、コマンドが Bash に存在するかどうかを確認する

type コマンドは、使用するエンティティに関する情報を提供する非常に便利な組み込みコマンドです。 コマンド、ファイル、キーワード、シェル組み込みなどで使用できます。

type コマンドの使用法を以下に示します。

type command

出力:

command is a shell builtin

より具体的には、このユース ケースでは、type コマンドを -p オプションとともに使用して、ファイルまたは実行可能ファイルのパスを取得できます。 これの使用法を以下に示します。

type -p npm

出力:

/usr/local/bin/npm

npm がシステムにインストールされているため、type -p は有効なパスを返しました。 存在しないエンティティに対して type コマンド (フラグなし) を使用すると、エラーが発生することに注意してください。 ただし、同じ場合の type -p は代わりに NULL を返します。

この動作を以下に示します。

type yarn

出力:

bash: type: yarn: not found

yarn がシステムにインストールされていないため、エラーが返されます。 ただし、type -p yarn は出力を返しません。 プログラムの存在をチェックする方法と理由に応じて、-p フラグを使用または省略できます。

hash コマンドを使用してコマンドが Bash に存在するかどうかを確認する

hash コマンドは type コマンドと同様に機能します。 ただし、コマンドが見つからない場合は正常に終了します。

さらに、照会されたコマンドをハッシュするという追加の利点があり、検索が高速になります。

コマンドの構文は次のとおりです。

hash -t ls

この場合、クエリ コマンドは ls です。 システムによっては、出力は次のようになります。

/usr/bin/ls

これは、コマンドが呼び出されたときに実行されるファイルの場所です。 コマンドが見つからない場合、たとえばクエリが hash -t nothing のようなものである場合、出力は次のようになります。

bash: hash: nothing: not found

コマンドが見つかったときの出力は説明的であり、次回の検索を高速化するためにコマンドをハッシュするという追加の利点があります。

test コマンドを使用してコマンドが Bash に存在するかどうかを確認する

test は、主に比較と条件ステートメントに使用される組み込みのシェル コマンドです。 ファイルとディレクトリの存在を確認するためにも使用できます。 test は、チェックしたいファイルまたはディレクトリの完全で有効なパスが提供されている場合にのみ機能することに注意してください。

ファイルとディレクトリに関連する test コマンドには多くのオプション フラグがあり、これらのオプション フラグのリストを以下に示します。

これらのフラグは、ファイルが存在し、特別な条件が満たされた場合にのみ true を返すことに注意してください。 以下に、リストされている特別な条件を見つけることができます。

  1. -b FILE - ファイルが特殊なブロック ファイルの場合は True
  2. -c FILE - ファイルが特殊文字ファイルの場合は True
  3. -d FILE - ディレクトリの場合は True
  4. -e FILE - タイプに関係なく、ファイルの場合は True
  5. -f FILE - True は、それが通常のファイル (たとえば、ディレクトリやデバイスではない) の場合のみです。
  6. -G FILE - コマンドを実行しているユーザーと同じグループがファイルにある場合は True
  7. -h FILE - シンボリック リンクの場合は True
  8. -g FILE - set-group-id (sgid) フラグが設定されている場合は True
  9. -k FILE - スティッキー ビット フラグが設定されている場合は True
  10. -L FILE - シンボリック リンクの場合は True
  11. -O FILE - コマンドを実行しているユーザーが所有している場合は True
  12. -p FILE - パイプの場合は True
  13. -r FILE - 読み取り可能な場合は True
  14. -S FILE - ソケットの場合は True
  15. -s FILE - ゼロ以外のサイズがある場合は True
  16. -u FILE - set-user-id (suid) フラグが設定されている場合は True
  17. -w FILE - 書き込み可能な場合は True
  18. -x FILE - 実行可能な場合は True

この例では、FILE は、ユーザーがチェックしたいファイルの完全で有効なパスを示しています。

test を使用してファイルの存在を確認する方法を以下に示します。

test -e etc/random.txt && echo "FILE exists."

上記のコード ステートメントは、ファイル etc/random.txt の存在をチェックし、テスト ステートメントが true を返す場合、FILE exists を出力します。

関連記事 - Bash Command