シェルスクリプトマナー
- 「 exit code が 0 じゃなきゃダメ」
- 「未知の変数があったらダメ」
- 「 pipe でつないだ時に途中の pipe で躓いてもダメ」
を矯正するには、それぞれ
set -e set -u set -o pipefail
する。短縮して
set -euo pipefail
と書ける。
多くの Linux 環境では /bin/sh の実態は bash なのだけど、 sh といえば bash と決まっているわけではない。 csh も ash も bash も zsh もある。
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/