上田ブログ

なお、このサイトはbashでできている。

お知らせ: 詳解確率ロボティクス増刷 /  シェルスクリプト高速開発手法入門改訂2版発売中 /  エンジニアHubで記事を書きました / 

bashのpipefailで確実にスクリプトを止める

Sun Apr 26 22:27:31 JST 2015 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 1531, keywords: ごめんなさい,bash,Linux,Mac,pipefail,ご報告,シェルプログラミング実用テクニック,寝る

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

シェルプログラミング実用テクニック、出版される前からもう補足ですが、私めがbashのpipefailというオプションをすっかり見落としていたのでフォローしておきます。

本文ではbashに-e(エラーがあったら止める)をつけてもパイプラインの左側のコマンドにエラーがあったときに処理が止まらないと書きました。

例です。

が、次のようにpipefailというオプションをセットしておくと(シバンの横には引数を一個しか渡せないと考えた方がよいので、下でsetを使って指定する)、次のように止まります。あらびっくり。

執筆する前にもうちょっとちゃんとmanをしっかり読んでおけよと自分に鋭いツッコミを入れましたが、bashの文法解説書というよりはコマンドの使い方解説書という感じで書いていたのでちょっと手薄になっておりました・・・。

manにはこう書いてあります。(Linuxだとmanの出力はパイプに渡せます。)

しっかし、これ読んでも一回で正しい意味を読み取れるかどうか自信はありませぬ・・・。

もうちょい補足

見落としに気づいたのは、やっぱりbashの場合、PIPESTATUSが実装されているんだからスクリプトを止める方があるんじゃないかということで、校了後に不安になっていろいろ調べているうちに上記カンニング先で「あっ!」となりました。

「-eだと止まらないことがあるので自分で後始末は実装しましょう」みたいな文脈で-eを説明したのですが、pipefailがあるのでこれは知見の足らん説明となります。

trapと組み合わると、後始末ができてしまいます・・・。

やってみましょう。

ああああアホでした。自分で気がついてよかった。

ということで、本書のシェルスクリプトが少し冗長ということが判明しましたが、シェルスクリプトよりワンライナーの方が圧倒的に多いのと、大半のスクリプトは書捨てなので、これを念頭に読んでいただければ大丈夫かと思います。

以上。最後に宣伝。すんません・・・。

寝る。



prev:シェルプログラミング実用テクニックの目次が公開されました(エクシェル芸、斉藤さん、and 鳩) next:今の騒動に思うこと