きつねたぬきだし

ちょっとしたメモ代わりに。

シェルスクリプトマナー

bashシェルスクリプトを書くときに、

  • 「 exit code が 0 じゃなきゃダメ」
  • 「未知の変数があったらダメ」
  • 「 pipe でつないだ時に途中の pipe で躓いてもダメ」

を矯正するには、それぞれ

set -e
set -u
set -o pipefail

する。短縮して

set -euo pipefail

と書ける。

多くの Linux 環境では /bin/sh の実態は bash なのだけど、 sh といえば bash と決まっているわけではない。 csh も ash も bashzsh もある。

Dash を初め、いくつかのシェルには pipefail がない。 http://ja.wikipedia.org/wiki/Debian_Almquist_shell なので #!/bin/sh ではなく #!/usr/bin/env bash と書く方が石橋を叩いて渡れる。

#!/usr/bin/env bash
set -euo pipefail

これらオプションについては賛否両論あるようだ。 例えば diff や cmp は、 exit code を比較結果を伝えるのに用いる。

Debian コミュニティでは set -e を init.d スクリプトに使うときは注意せよ、と言っている。 https://www.debian.org/doc/debian-policy/ch-opersys.html

より詳細な bash プログラミングについては Advanced Bash-Scripting Guide を読むと良い。 http://www.tldp.org/LDP/abs/html/