実行する一連のコマンドがあります。ただし、「コマンドが見つかりません」というエラーが発生するたびに終了する必要があります。したがって、出力の実行後チェックはオプションではありません
「$?」「コマンドが見つからない」場合と成功した場合、変数はゼロに等しくなります。
コマンドが見つからない場合、終了ステータスは 127 になるはずです。ただし、bash
4 以降を使用していて、command_not_found_handle
defined という関数がある場合があります。この関数は、コマンドが見つからない場合に呼び出され、127 コードをマスクして 0 で終了する場合があります。
関数が定義されている場合、実行type command_not_found_handle
すると関数の定義が表示されます。を実行することで無効にできますunset command_not_found_handle
。
更新しました
試す
[ -x "$executable" ] && echo "Command '$executable' not found" >&2 && exit 1
これにより、stderr にエラーが書き込まれ、1 つの終了コードで終了します。
ユーティリティの名前だけを持っている場合は、組み込みでそのパスを確認できますtype
。
例:
type type
type ls
type xls
出力:
type is a shell builtin
ls is /usr/bin/ls
./test.sh: line 13: type: xls: not found
ユーティリティが見つからない場合、テストは 1 を返します。
したがって、$executable
が何でもよい場合 ( bash ビルドイン、エイリアス、バイナリなど)、これを使用できます。
type -p ls>/dev/null && ls -l
type -p xls>/dev/null && xls --some_arg
これは実行されますがls
(任意の実行可能ファイル)、xls は実行されません。
とにかく、スクリプトでexecfail
オプションが設定されていない場合 ( shopt
)、スクリプトはbash: some_utility: command not found
エラー メッセージを表示した後に終了します。このオプションが設定されている場合、続行します。しかしtrap
、疑似信号ERR
を送信して、必要なことを行うことができます:
shopt -s execfail
fnc() { echo $?, $_, Oops;}
trap fnc ERR
ls -d *|head -2
xls
yls
出力:
a1
a2
./test_tLcn.sh: line 8: xls: command not found
127, xls, Oops
./test_tLcn.sh: line 9: yls: command not found
127, yls, Oops