「すべてのコマンドは前のすべてのコマンドに依存します。コマンドが失敗した場合、スクリプト全体が失敗するはずです」という言葉を考えれば、エラーを処理するための特別な機能は必要ないと思います。
必要なのは、&&
オペレーターと||
オペレーターでコマンドをチェーンすることだけです。
たとえば、前のコマンドのいずれかが壊れた場合(bashは左から右に読み取ります)、このチェーンは壊れ、「問題が発生しました」と出力します。
cd foo && rm a && cd bar && rm b || echo "something went wrong"
実際の例(実際のデモのために、dir foo、file a、dir bar、file bを作成しました):
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm bb || echo "something is wrong"
rm: cannot remove 'bb': No such file or directory
something is wrong #mind the error in the last command
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm aa && cd bar && rm b || echo "something is wrong"
rm: cannot remove 'aa': No such file or directory
something is wrong #mind the error in second command in the row
そして最後に、すべてのコマンドが正常に実行された場合(終了コード0)、スクリプトは続行します。
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm b || echo "something is wrong"
gv@debian:/home/gv/Desktop/PythonTests/foo/bar$
# mind that the error message is not printed since all commands were successful.
覚えておかなければならないのは、&&を使用すると、前のコマンドがコード0で終了した場合に次のコマンドが実行されるということです。
チェーン内のいずれかのコマンドで問題が発生した場合は、コマンド/スクリプト/以下のすべてが|| 実行されます。
記録のためだけに、壊れたコマンドに応じて異なるアクションを実行する必要がある場合は、クラシックスクリプト$?
を使用して、直前のコマンドの終了コードを報告する値を監視することで実行することもできます(コマンドが正常に実行された場合はゼロを返します)または、コマンドが失敗した場合は他の正の数)
例:
for comm in {"cd foo","rm a","cd bbar","rm b"};do #mind the error in third command
eval $comm
if [[ $? -ne 0 ]];then
echo "something is wrong in command $comm"
break
else
echo "command $comm executed succesful"
fi
done
出力:
command cd foo executed succesfull
command rm a executed succesfull
bash: cd: bbar: No such file or directory
something is wrong in command cd bbar
ヒント:「bash:cd:bbar:No such file ...」というメッセージを表示しないようにするには、 eval $comm 2>/dev/null