web-dev-qa-db-ja.com

サブシェルから終了コードを取得することは可能ですか?

私がこれを呼ぶbashスクリプトを持っていると想像してみましょう:

bash -c "some_command"
do something with code of some_command here

some_commandのコードを取得することは可能ですか?スクリプトを実行しているシェルで直接some_commandを実行していません。これは、スクリプトの環境を変更したくないためです。

25
Geo

$?には、通常どおりsome_commandの戻りコードが含まれます。

もちろん、コマンドを実行する前に何か問題が発生した場合に備えて、bashのコードが含まれている場合もあります(ファイル名が間違っているなど)。

30
Matti Virkkunen

これは、$?と、PaggasおよびMattiで言及されている括弧サブシェルの図です。

$ (exit a); echo $?-bash: exit: a: numeric argument required
255
$ (exit 33); echo $?33

前者の場合、コードはBashエラーであり、後者の場合、コードはexitの終了コードです。

_$?_変数を使用できます。これについては、bashのドキュメントを確認してください。これにより、最後のコマンドの終了ステータスが保存されます。

また、bashのブラケットスタイルのコマンドブロック(例:comm1 && (comm2 || comm3) && comm4)を確認することもできます。これらは常にサブシェルで実行されるため、現在の環境は変更されず、より強力です。

編集:たとえば、bash -c 'コマンド'と比較して()スタイルのブロックを使用する場合、スペースを含む引数文字列やその他の特別なシェル構文をエスケープすることを心配する必要はありません。シェル構文を直接使用します。これは、残りのコードの通常の部分です。

7
Paggas