BLOGTIMES
2011/08/24

パイプでつないだコマンドの終了ステータスをとる

  sh 
このエントリーをはてなブックマークに追加

パイプでつないだコマンドの終了ステータスをとる方法が分かったのでメモ。

普通はあまり使わないテクニックですが、シェルスクリプトを組むときにパイプの前半部分の終了コードが必要になることがあります

$ hogecmd | tee -a hoge.txt

例えば上記のようなコマンドの直後に$?で終了ステータスを取得すると、hogecmd ではなく、tee -a hoge.txt の部分の終了ステータスになってしまって、シェルスクリプトで条件分岐を書くときに困るのです。この制約を突破するためにこれまでは一時ファイルを使ったり、名前付きパイプを使うなど、パイプを使わないで乗り越えて来たのですが、専用の特殊変数が用意されていたとは盲点でした

bashによるシェルスクリプトの小技(2) - shibainu55日記

${PIPESTATUS[@]}

パイプで連結した各コマンドの終了ステータスが設定される変数(配列)。パイプ(「|」)により連結された各コマンドの終了ステータスが設定設定されている変数(配列)。 変数 $? ではパイプの一番最後にあるコマンドの終了ステータスしか参照することができないが、この変数を使用することでパイプの先頭、 もしくは途中にあるコマンドの終了ステータスを参照することができる (残念ながら bash のみで ksh では使用できない)。

上記に従って、パイプを使っていても下記のようにシェルスクリプトで条件判定をすることができるようになりました。

hogecmd | tee -a hoge.txt if [ ${PIPESTATUS[0]} -eq 0 ] ; then echo "OK!" else echo "NG!" fi

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4407
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    Gra (2017/01/21 14:16)

    普段はあまりつかわないとおっしゃっておりましたが、パイプの最終コマンド以外の終了ステータスを得られなくて、さてどうしたものかと困っておりました。こんな特殊変数があったのですね。
    本記事、大変参考にさせていただきました。ありがとうございました。

    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン