- blogs:
- cles::blog
2011/08/24

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

パイプでつないだコマンドの終了ステータスをとる方法が分かったのでメモ。
普通はあまり使わないテクニックですが、シェルスクリプトを組むときにパイプの前半部分の終了コードが必要になることがあります。
$ 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)
<%HatenaAuth()%>
普段はあまりつかわないとおっしゃっておりましたが、パイプの最終コマンド以外の終了ステータスを得られなくて、さてどうしたものかと困っておりました。こんな特殊変数があったのですね。
本記事、大変参考にさせていただきました。ありがとうございました。
Comments Form
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . Windows 10 で勝手にログアウトされないようにする(3654)
2 . リモートデスクトップで Alt + PrtSc と同じことをするには(3109)
3 . RDP のプロトコルを TCP だけに変更する(2408)
4 . 「日次」は「にちじ」じゃない?(2232)
5 . リモートデスクトップで Ctrl + Alt + Del キーを送信するには(2151)
2 . リモートデスクトップで Alt + PrtSc と同じことをするには(3109)
3 . RDP のプロトコルを TCP だけに変更する(2408)
4 . 「日次」は「にちじ」じゃない?(2232)
5 . リモートデスクトップで Ctrl + Alt + Del キーを送信するには(2151)
cles::blogについて
Referrers