続行する代わりに、最後に失敗したコマンドのエラーコードで終了する必要があるbashスクリプトを作成しています。 Everywhereを追加することでこれを行うことができますが、見苦しいすべての行なしでこれを実行するために最初にオプションを選択するなどの|| exit $?
より簡単な方法はありますか?set
答え1
set -e
?
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Set or unset values of shell options and positional parameters.
Change the value of shell attributes and positional parameters, or
display the names and values of shell variables.
Options:
-a Mark variables which are modified or created for export.
-b Notify of job termination immediately.
-e Exit immediately if a command exits with a non-zero status.
...
答え2
ブロックの最後で&&
使用して、すべてのコマンドをリンクできます。|| exit $?
たとえば、
#!/usr/bin/ksh
ls ~/folder &&
cp -Rp ~/folder ~/new_folder &&
rm ~/folder/file03.txt &&
echo "This will be skipped..." ||
exit $?
ファイルが存在しない場合は、~/folder/file03.txt
最後のコマンドをスキップします。echo
次の内容を受け取る必要があります。
$ ./script.ksh
file01.txt file02.txt
rm: cannot remove /export/home/kkorzeni/folder/file03.txt: No such file or directory
$ echo $?
1
ありがとう、クシシュトフ
答え3
スクリプトで発生するすべてのエラーをキャッチするためにトラップ機能を定義できます。
#!/usr/bin/ksh
trap errtrap
function errtrap {
es=$?
echo "`date` The script failed with exit status $es " | $log
}
残りのスクリプトは次のとおりです。
TRAPはすべてのコマンドのエラーをキャッチしてこのerrtrap
関数を呼び出します。使いやすくするために、errtrap
関数を汎用にして生成したスクリプトから呼び出すことができます。