こんにちは、龍権(@ryuken_biz)です。

プログラミングのネタは初めてかもしれません。
今回はシェルの小技をご紹介します。

コマンドの結果を知る方法

シェルの実行結果が成功か失敗か分かる方法は簡単ですよね。
そうなんです。
$? を使えば良いんです。例えば、

$ date
2019年  8月  3日 土曜日 13:53:28 JST
$ echo $?
0

最後に「0」が表示されているので、これは成功したよってことですね。

シェルでよくある使い方に、複数のコマンドをパイプで繋いで使う方法があります。
こんな時でも、もちろん上の方法が使えます。例えば、

$ date | echo "time"
time
$ echo $?
0

パイプで繋いだ時にどうしても一つ目のコマンドの実行結果を知りたい時があります。
このような場合は、上の方法が使えないですね。
わざと一つ目のコマンドを失敗させていますが、終了コードは「0」になっています。

$ dat | echo "time"
time
-bash: dat: コマンドが見つかりません
$ echo $?
0

実は、$?は最後の終了コードしか取得できません。

パイプ繋ぎの途中結果を知る方法

一つ目のコマンドの実行結果が分かる方法がないか調べてみたら、ちゃんとありました。
パイプラインで繋いだコマンドの終了ステータスは、PIPESTATUS という変数に格納されます。たとえば、

$ dat | echo "time"
time
-bash: dat: コマンドが見つかりません
$ echo ${PIPESTATUS[0]}
127
$ dat | echo "time"
time
-bash: dat: コマンドが見つかりません
$ echo ${PIPESTATUS[1]}
0

終了ステータスをまとめて表示したい時は、

$ dat | echo "time"
time
-bash: dat: コマンドが見つかりません
$ echo ${PIPESTATUS[@]}
127 0

で一発で取れます。