実行可能なシェルスクリプトの冒頭には、「シバン」というインタプリタの指定行がありますが、ここで#!/bin/bash
のように明示するのも1つの方法じゃないか、と思いました。
対象読者
シェルスクリプト冒頭の#!/bin/sh
について、
- 単なるコメントだと思っている人
- 「おまじない」として書いている人
-
/bin/sh
がどんなシェルなのか知らない人
シバン行とは
スクリプトファイルの冒頭を#!
にして、その後にファイル名を書いておくと、実行属性を付けてファイルを実行できるようになります。この冒頭行を「シバン」といいます。
もちろん、#!/bin/sh
のようなシェルスクリプトに限られるものではなく、Perl、Python、Rubyなどテキストで書くスクリプトでも同様に実行可能となります。
/bin/sh
って?
一般には、シェルスクリプトのシバン行は#!/bin/sh
と書きます。POSIXでもこの位置においてあるというように、Unix系の多くの環境で実行しようと思えば、最大公約数的にsh
を使う必要があります。
シェルスクリプトが主体的に仕事をする場合、POSIX shとPOSIXの範囲内のコマンドを使って書けば、どんな環境に持っていっても通用するツールを作ることができます。
とはいえ、シェルスクリプトを使う例としては、「シェルスクリプト自体で1つの機能を実現する」というより、「既存のプログラムをつないで自動実行させるために、シェルスクリプトとしてコマンドを並べる」というような例も多いかと思います。入っているコマンドどころか、下手をすればファイルやディレクトリの位置にすら依存する、そのようなシェルスクリプトに、「#!/bin/sh
の範囲内で書け」と言ったところで、縛りプレイになる以上の実用的な意味は見込めません。
bash明記のメリット
#!/bin/bash
のようにしてbashを使うことを明示することで、Bash固有の機能を堂々と使えるようになります。
-
(())
による式展開 -
[[]]
による高度な比較機能 配列変数
-
<(コマンド)
のようにして、コマンドの結果をリダイレクト
シェルスクリプトの実行制御は多くが記号によることもあって、眺めても「これはbash特有だ」と気づきにくいものです。Ubuntuでも、/bin/sh
をbashからdash(拡張機能は少ない)に変更したところ、#!/bin/sh
なのにbash固有の記法で書いていてうまく動かなくなるシェルスクリプトが多発して問題となったことがあります。
上のようにうっかり書いてしまうこともありますし、独自拡張は「便利だから」入れているものですので、どうせ移植性、永続性の期待できないようなスクリプトであれば、限定するのも合理的かなと思います。