コマンドが Bash に存在するかどうかを確認する
-
command -v
コマンドを使用して、コマンドが Bash に存在するかどうかを確認する -
type
コマンドを使用して、コマンドが Bash に存在するかどうかを確認する -
hash
コマンドを使用してコマンドが Bash に存在するかどうかを確認する -
test
コマンドを使用してコマンドが 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
がインストールされているかどうか、つまり、ユーザー ディレクトリ内に存在するかどうか、および実行可能かどうかを確認します。 Path
に npm
が見つからない場合、上記のコードは例外を発生させて終了します。
上記のテンプレートを使用して、そのプログラム/コマンド/ユーティリティの名前を使用して、プログラム/コマンド/ユーティリティの存在を確認できます。
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
を返すことに注意してください。 以下に、リストされている特別な条件を見つけることができます。
-b FILE
- ファイルが特殊なブロック ファイルの場合はTrue
。-c FILE
- ファイルが特殊文字ファイルの場合はTrue
。-d FILE
- ディレクトリの場合はTrue
。-e FILE
- タイプに関係なく、ファイルの場合はTrue
。-f FILE
-True
は、それが通常のファイル (たとえば、ディレクトリやデバイスではない) の場合のみです。-G FILE
- コマンドを実行しているユーザーと同じグループがファイルにある場合はTrue
。-h FILE
- シンボリック リンクの場合はTrue
。-g FILE
-set-group-id
(sgid
) フラグが設定されている場合はTrue
。-k FILE
- スティッキー ビット フラグが設定されている場合はTrue
。-L FILE
- シンボリック リンクの場合はTrue
。-O FILE
- コマンドを実行しているユーザーが所有している場合はTrue
。-p FILE
- パイプの場合はTrue
。-r FILE
- 読み取り可能な場合はTrue
。-S FILE
- ソケットの場合はTrue
。-s FILE
- ゼロ以外のサイズがある場合はTrue
。-u FILE
-set-user-id
(suid
) フラグが設定されている場合はTrue
。-w FILE
- 書き込み可能な場合はTrue
。-x FILE
- 実行可能な場合はTrue
。
この例では、FILE
は、ユーザーがチェックしたいファイルの完全で有効なパスを示しています。
test
を使用してファイルの存在を確認する方法を以下に示します。
test -e etc/random.txt && echo "FILE exists."
上記のコード ステートメントは、ファイル etc/random.txt
の存在をチェックし、テスト ステートメントが true
を返す場合、FILE exists
を出力します。