50
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

シェルスクリプトの冒頭でbashを明示する(提案)

Last updated at Posted at 2016-08-25

実行可能なシェルスクリプトの冒頭には、「シバン」というインタプリタの指定行がありますが、ここで#!/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固有の記法で書いていてうまく動かなくなるシェルスクリプトが多発して問題となったことがあります。

上のようにうっかり書いてしまうこともありますし、独自拡張は「便利だから」入れているものですので、どうせ移植性、永続性の期待できないようなスクリプトであれば、限定するのも合理的かなと思います。

50
45
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?