Linux の /bin/sh て基本的に bash ですな。で、これで sh スクリプトを書いてあると、あるときこれを *BSD とかでも使おうと思ったときにハマります。*BSD の /bin/sh は bash じゃないから1。
というようなことは 横着プログラミング 第11回: 小粒なツールたち でも触れられていて、ここで高林さんは
私はちょっと複雑なシェルスクリプトを書く場合には /bin/zsh を使うようにしている。
これは zsh の拡張機能を使いたいためということもあるが、「bashism」なシェルスクリプトを書くのを避けるためという意味も大きい。bashism なシェルスクリプトとは、#! /bin/sh で始まっているにも関わらず、 bash の拡張機能を使っているもののことである。
という豪快な解決法に辿り付いているんだけど、自分は逆に「Linux でもストイックに /bin/sh の機能に絞って書けばいい」という方向に傾けてみる。とは言えやることは簡単で、Debian で
apt-get install ash
するだけ。これは実際には dash に link を張るだけのシロモノで、dash ってのは The Debian Almquist Shell のこと。
Almquist shell - Wikipedia, the free encyclopedia
によれば
- *BSD の default shell は ash で
- これの Debian implementation が dash
なので、Debian を使っているならこれを使って
/bin/ash -xv SCRIPT
/bin/dash -xv SCRIPT
としてデバッグしていけば安心して使える sh スクリプトが書けるって塩梅。
ちなみに最近試していた CentOS の方ではそんな shell は見つからないので、これをやるには Debian を使うのがよさげ。あるいは OSX だと Fink には ash がある。MacPorts は知らない。そういえば cygwin に ash ありますね。
もう一つの方法として zsh の emulation が使えるかなと思ったんだけど、sh って名前で立ち上げても sh そのものの挙動をエミュレートするわけじゃないみたい。とりあえず sh ではエラーになる書き方でもそのまま動いてしまった。
ash 依存はいいのか! Bourne shell で動かなかったらどうする! とか言われても困ります。そんな shell を実際に触ったことがありませんごめんなさい。
OSX は bash なので問題ない。 ↩