256bitの殺人メニュー

インフラエンジニアだったソリューションアーキテクトなくわののブログ。こちらのBlogは個人の意見となっていて会社とは全く関係ありません。お約束です。[twitter:@kuwa_tw]めんどくさがりが重い腰を上げて何かをアウトプットすることにどれほどの意味があるのかを試してみたいブログでもある。

シェルスクリプトでパイプを使った時の戻り値のとり方

はい、おつカレー様です。
bashを使ったシェルスクリプトでパイプを使っても戻り値をちゃんと取りたいときの話です。

シェルスクリプトの戻り値

シェルスクリプトでの戻り値取るときに $? を使うことがあると思います。

$ ls /                    # こっちは正常
$ echo $?
0
$ ls /notfounddir  # こっちはエラー
$ echo $?
1

コマンドのログを取りたいなと思ってteeとかつなげちゃうとteeの戻り値になっちゃって取れないですよね。

$ ls /notfounddir | tee test
ls: /notfounddir: No such file or directory
$ echo $? 
0                # <-アレ?

${PIPESTATUS[@]}

こういう場合は、${PIPESTATUS[@]}を使うことで取ることができます。

$ ls / | tee test.log
$ echo ${PIPESTATUS[@]}
0 0
$ ls /notfounddir | tee test.log
ls: /notfounddir: No such file or directory
$ echo ${PIPESTATUS[@]}
1 0
$ echo ${PIPESTATUS[0]}
1

というわけです、便利ですねー。
こういう場合は良くあって、最初気づかなくて後で困ることも良くあるので、使ってみてくださいね(╹◡╹)

補足

他にも内部変数は幾つかあるので、このへんを見ると役に立つものがあるかも
http://tldp.org/LDP/abs/html/internalvariables.html


[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)