内部的に呼び出される2つのシェルスクリプトa.sh
とがあるとします。次に、終了コードまたは終了を使用できると仮定します。b.sh
a.sh
b.sh
b.sh
0
1
2
の終了コードをa.sh
終了コードと区別するためにどのような技術を使用できますかb.sh
?たとえば、a.sh
終了コードを使用して終了できると判断した場合、呼び出し元にとって1
これは不明です。失敗しましたかa.sh
、それともb.sh
失敗しましたか?これは終了コードを使用しないでください。a.sh
ただし、選択できる終了コードの数は限られており、理論的に進化するにつれて、追加の終了コードがいくらでも追加される可能性があります。1
2
b.sh
スクリプトユーザーが区別できるように、終了コードと共にいくつかの追加データを渡すために使用できる技術はありますか?どのプログラムは実際に失敗しましたか?それとも、スクリプト作成者として、スクリプトがブラックボックスとして扱われ、ユーザーが実行中のスクリプトが実行する個々の操作について洞察を得られないと仮定する必要がありますか?つまり、シェルスクリプトの終了コードは、最も外側のスクリプトの結果としてのみ解釈できますか?
答え1
通常、エラーメッセージが出力され、誤った状態が返されます。
# a.sh
if ! b.sh foo bar; then
echo >&2 "a.sh: b.sh failed"
exit 1
fi
if something else; then
echo >&2 "a.sh: some other error"
exit 1
fi
その後、別の番号を使用してケースを区別したい場合は、そうすることができますa.sh
。必要に応じて返された特定のエラーを確認し、b.sh
それを使用してから決定することもできますa.sh
。
もちろん、より長いテキスト識別子を使用できるように、特定の形式でエラーメッセージを構成することもできます。
後者が前者を呼び出すという事実も実装の詳細でなければならないので、b.sh
から直接返された終了状態を返すことは妥当ではないと確信しています。a.sh
A の全機能が B を包み込んでいない場合、ユーザーは A が内部的に何をしているのか気にする必要はありません。さらに、最初に他のツールを使用したツールは後で修正され、それ自体で同じことを行うことができます(よりうまく機能する場合)。逆に、特定のタスクを独自に実行するツールを変更して、他の既存のツールを利用することもできます。これはコードの重複を減らします。終了値を渡すと、これらの内部変更が直接公開されます。
それにもかかわらず、発信者が特定の終了ステータス(通常の「成功/失敗」を除く)が何を意味するのかを知りたい場合は、その特定のツールについて記録する必要があります。
その後、より大きなツールライブラリを構築する場合は、さまざまな状況に共通の終了値システムを作成し、ライブラリ全体に対してそのシステムを文書化できます。
答え2
終了コードを記録するにはどうですか?
良い収益を生み出します。ただし、b.sh
終了コードのペアを呼び出し側に直接表示したい場合、または必要に応じてa.sh
終了コードにオフセットを追加することを検討してください。b.sh
たとえば、 b.sh
2 で終了すると、42 (例: +40) で終了a.sh
できます。$?