4

実行する一連のコマンドがあります。ただし、「コマンドが見つかりません」というエラーが発生するたびに終了する必要があります。したがって、出力の実行後チェックはオプションではありません

「$?」「コマンドが見つからない」場合と成功した場合、変数はゼロに等しくなります。

4

3 に答える 3

6

コマンドが見つからない場合、終了ステータスは 127 になるはずです。ただし、bash4 以降を使用していて、command_not_found_handledefined という関数がある場合があります。この関数は、コマンドが見つからない場合に呼び出され、127 コードをマスクして 0 で終了する場合があります。

関数が定義されている場合、実行type command_not_found_handleすると関数の定義が表示されます。を実行することで無効にできますunset command_not_found_handle

于 2013-06-04T13:05:27.390 に答える
1

更新しました

試す

[ -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が何でもよい場合 ( 、エイリアス、バイナリなど)、これを使用できます。

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
于 2013-06-04T12:49:23.270 に答える