Linux で sh スクリプトを書くときは Debian がいいのか?

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 を実際に触ったことがありませんごめんなさい。

  1. OSX は bash なので問題ない。 

More