戻り値を取得する際は通常「$?」を使用しますが、パイプを使用している場合は正しく取得出来ません。今回はパイプ使用時に正しい戻り値を取得する方法を説明します。
$? を使用した場合の動き
$? を使用して戻り値を取得した例です。
下記のように、$?を使用して取得した場合、
パイプの一番最後に実行したコマンド(一番右のコマンド)の結果が取得されてしまいます。
[root@localhost ~]# exit 3 | exit 2 | exit 1 [root@localhost ~]# echo $? 1
[root@localhost ~]# exit 2 | exit 1 | exit 0 [root@localhost ~]# echo $? 0
パイプしたコマンド全ての戻りを取得
システム変数「PIPESTATUS」を使用することで、下記のようにパイプした全てのコマンドを戻り値を取得することが可能です。
[root@localhost ~]# exit 3 | exit 2 | exit 1 [root@localhost ~]# echo ${PIPESTATUS[@]} 3 2 1
リンク
パイプ中の指定したコマンドの戻り値を取得する
システム変数「PIPESTATUS」は配列になっているため、配列を添字で指定することで各コマンドの戻り値を取得することが可能です。
[root@localhost ~]# exit 3 | exit 2 | exit 1 [root@localhost ~]# echo ${PIPESTATUS[1]} 2
パイプしたコマンドの判定処理
パイプされた全てのコマンドが正常終了、または1つでも異常終了した場合の判定方法になります。
全てのコマンドが正常終了(戻り値[0])の場合は、「OK」と表示されます。
[root@localhost ~]# exit 0 | exit 0 | exit 0 [root@localhost ~]# if [[ `echo ${PIPESTATUS[@]} | sed -e "s/0 //g"` == 0 ]];then echo OK;else echo NG;fi OK
1つでも異常終了(戻り値が[0]以外)がある場合は、「NG」と表示されます。
[root@localhost ~]# exit 0 | exit 1 | exit 0 [root@localhost ~]# if [[ `echo ${PIPESTATUS[@]} | sed -e "s/0 //g"` == 0 ]];then echo OK;else echo NG;fi NG
記事は以上です。
リンク
コメント