それはそれを注意すべきであるif...then...fi
と&&
/ ||
私たちは(成功時には0)をテストしたいコマンドで返される終了ステータスでアプローチのお得な情報のタイプ。ただし、一部のコマンドは、コマンドが失敗した場合、または入力を処理できなかった場合、ゼロ以外の終了ステータスを返しません。これは、これらの特定のコマンドでは通常のアプローチif
と&&
/ ||
アプローチが機能しないことを意味します。
たとえば、Linuxでは、GNU file
は引数として存在しないファイルを受け取り、find
指定されたユーザーを見つけることができなかった場合、0で終了します。
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
このような場合には、我々は状況を扱うことができる1個の潜在的な方法は、読書であるstderr
/ stdin
メッセージ、例えばによって返されたものfile
のコマンド、またはのようにコマンドの出力を解析しますfind
。そのために、case
ステートメントを使用できます。
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
(これは、unix.stackexchange.comの関連する質問に関する私自身の回答の再投稿です)