すべての行に `||exit$?` を追加せずにエラーハングスクリプトを書くには?

すべての行に `||exit$?` を追加せずにエラーハングスクリプトを書くには?

続行する代わりに、最後に失敗したコマンドのエラーコードで終了する必要がある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関数を汎用にして生成したスクリプトから呼び出すことができます。

関連情報