web-dev-qa-db-ja.com

./a.out && echo $? return = 0の場合にのみ戻り値を出力します

echo $?次のシナリオでは、戻り値、つまり1は表示されません。

echo "int main() { return 1; }" > foo.c
gcc foo.c && ./a.out && echo $?

ただし、echo $?は、プログラムが0を返すときに機能します。これはなぜですか?

注:上記のコードの後に​​別のecho $?を実行すると、目的の出力1が得られます。

1
Harvinder

&&演算子はブール値ですおよび短絡評価あり。これは、最初のコマンドが成功した場合にのみ2番目のコマンドを実行することを意味します(つまり、0を返します)。それが使用される典型的な方法は次のようなものです:

tar xf file.tar && rm file.tar

これは、抽出が成功した場合にのみファイルを削除します。

スクリプトには、この良い例も含まれています。

gcc foo.c && ./a.out

gccが成功した場合にのみ、プログラムの実行を試みます。

$?の成功に関係なく、a.outを表示したい場合は、次のように記述できます。

gcc foo.c && { ./a.out ; echo $? ; }

{...}はコマンドをグループ化して、コンパイルが成功した場合に両方が実行されるようにします。

1
Barmar