Posted at

"bashism" について思うこと

More than 3 years have passed since last update.

巷ではずっと、「bashism」についていろいろと言われています。


  • Bash がインストールされていることを隠れた前提にするな

  • Bash の独自拡張を使用しているのに shebang に #!/bin/sh と書くな

  • Bash の独自拡張をなるだけ避けて(POSIX互換にとどめて) #!/bin/sh にしろ


  • #!/bin/bash ではなく #!/usr/bin/env bash にしろ

などと言われているようです。

実際には Bash にも POSIX 互換モードはありますが、 POSIX 互換シェルとして DASH というものまでありますね。


GNU/Linux であって、Linux ではない

OSの名称として、「Linux」という誤用がよくなされています。

(フリーソフトウェア主義が不都合な人による)意図的な誤用から始まったのでしょうが、それが流布して、意図せず「Linux」という表現で呼んでいる人が大多数です。

(だから ストールマン(RMS) は、「GNU/Linux と呼べ」と言っているわけです。)


Bash は GNU の一部である

そして Bash は、GNU プロジェクトの一部であり、事実上でGNUの標準的なシェルになっています。Wikipedia の記事

そのため、


  • 「GNU/Linux なら Bash がインストールされていてフツー」

  • GNU は、 UNIX、BSD(それとOSX ……)とは異なる OS であり、移植容易性(可搬性; portability)に固執することもない

と思う人がいてもおかしくありません。

Ubuntu だけではなく、フリーソフトウェアについて「意識高い系」の Debian までも DASH が /bin/sh である事実には、私はいささかアンニュイになることも否めません。

DASH は、GNUのコンポーネントでないうえに、ライセンスも(一部ファイルを除き)、GPL ではなく BSD 3条項です。


可搬性(動作保証)はどこまで必要なのか


  1. UNIX系でも動くことも想定して、シェルスクリプトを一般公開したのならば、そのスクリプトは POSIX 互換であるべきです。

  2. GNU/Linux 専用のスクリプトであっても、Debianなどを想定すると、 Bash 用ならば #!/bin/bash にしたほうが良いです。

  3. 移植しない、非公開のスクリプトならば、POSIX互換に固執する必要はありません。/bin/sh/bin/bash のシステムを使い続けるかぎりは。

  4. Bash 専用でなければならないスクリプトなのに、BSD・UNIX で Bash をインストールしてもらう前提で #!/usr/bin/env bash と書かなければならないというのは、一般論としては少ないと思います。そのOSはGNUではないのに、Bashをインストールすること自体が特殊だからです。それよりも相手側に、/bin/bashのシンボリックリンクでも作ってほしいと思います。


それでも重要なこと

Bash の独自拡張を知らず知らずのうちに使っていると、他のシェルを使うときに困ります。

つまり、あなたは Bash しか使わない人なのでしょうか。

例えば if [[ ${foo} == bar ]] ; then みたいなのを普段から書いていたら、ほかのシェルを使うたびに引っかかります。

Bash 独自拡張があること自体は知っておかないと、他のシェルを使ったときに、なぜ動かないということが起こるのかよくわからないまま書き換えるだけで「お茶を濁す」おざなりな行動の繰返しで終わってしまうでしょう。