echo $?次のシナリオでは、戻り値、つまり1は表示されません。
echo "int main() { return 1; }" > foo.c
gcc foo.c && ./a.out && echo $?
ただし、echo $?は、プログラムが0を返すときに機能します。これはなぜですか?
注:上記のコードの後に別のecho $?を実行すると、目的の出力1が得られます。
&&
演算子はブール値ですおよび短絡評価あり。これは、最初のコマンドが成功した場合にのみ2番目のコマンドを実行することを意味します(つまり、0
を返します)。それが使用される典型的な方法は次のようなものです:
tar xf file.tar && rm file.tar
これは、抽出が成功した場合にのみファイルを削除します。
スクリプトには、この良い例も含まれています。
gcc foo.c && ./a.out
gcc
が成功した場合にのみ、プログラムの実行を試みます。
$?
の成功に関係なく、a.out
を表示したい場合は、次のように記述できます。
gcc foo.c && { ./a.out ; echo $? ; }
{...}
はコマンドをグループ化して、コンパイルが成功した場合に両方が実行されるようにします。