Linuxシェルスクリプトの「#!」(シバン)とは?意味と使い方を徹底解説
#! は一般に「shebang(シバン)」「shabang」「hashbang」「poundbang」などと呼ばれます。本記事では「シバン」という呼び方で統一して解説します。
無数のLinuxシェルスクリプトの冒頭に記述されているこの記号ですが、実際には何を意味しているのでしょうか。仕組みをひとつずつ分解して見ていきましょう。
シバンは通常このように書かれる
#!/bin/bash
#! はファイルの先頭、通常は1行目に記述され、その後ろには実行ファイルへのパスが続きます(上の例では bash シェルを指定しています)。
シバンはコメントの一種である
# で始まる行であるため、スクリプトの一部として実行されることはありません。しかし、スクリプトの動作には大きく関わってきます。その理由は次の通りです。
インタプリタディレクティブとして機能する
シバンは、インタプリタの実行ファイルへのパスをシステムに伝えることで、「このスクリプトをどのインタプリタで実行すべきか」を指示する役割を担います。
- 正しいインタプリタがファイル全体を処理できるよう、通常はファイルの1行目に記述します。
- 指定するパスは、適切な実行ファイルへの絶対パスである必要があります。
- シバンの行にはインタプリタへ渡すオプションを含めることもできますが、対応状況は環境によって異なります。トラブルを避けるため、オプションは1つだけにしておくのが安全です。
具体的な記述例
以下に、代表的な #! の記述例とその意味を紹介します。
bash を指定する場合
#!/bin/bash
スクリプトの先頭にこの行を置くと、bashシェルの実行ファイルを使ってスクリプトを実行するようシステムに指示できます。
zsh を指定する場合
#!/bin/zsh
同様に、この行により zsh シェルでスクリプトが実行されます。bash と zsh の違いについても、別記事で詳しく解説していますので、あわせてご覧ください。
Python を指定する場合
#!/usr/bin/env python3
Python 3 でスクリプトを実行します。注目すべきは、python3 実行ファイルのパスを直接書くのではなく、/usr/bin/env を経由して「そのユーザーの環境で現在有効になっている python3」を探して実行する点です。これにより、環境が異なるマシン間でもスクリプトを移植しやすくなります。
何も実行しない例
#!/bin/false
失敗を表すステータスコードを返し、スクリプト本体は実行されません。直接実行されることを想定していないスクリプト(ライブラリとして読み込まれるファイルなど)で使われるテクニックです。
シバンをバイパスして実行する方法
次のようにスクリプトを実行した場合を考えてみましょう。
./myscript.sh
ここで myscript.sh はスクリプトのファイル名です。この実行方法では、シバンが参照され、使用するインタプリタが決定されます。なお、この方法で実行できるのは、現在のユーザーに実行権限が付与されているスクリプトのみです。
一方、次のように実行した場合はどうでしょうか。
bash myscript.sh
この場合、呼び出しコマンドの中で bash を明示的に指定しているため、シバンの行は使用されません。実行されているのはスクリプトではなく bash の方であり、スクリプトは bash に読み込まれているだけです。そのため、この方法で必要なのはスクリプトの読み取り権限のみとなります。
-
Linuxシェルの基礎とシェルスクリプト入門のポイント – パートI
百聞は一見に如かず——以下の図を見れば、Linuxの仕組みがひと目でわかります。 関連記事 シェルプログラミングを学べる5つのシェルスクリプト – パートII Linux BASHスクリプティングの世界を旅する – パートIII Linuxシェルの基礎用語 シェル(Shell): ユーザーとオペレーティングシステム(OS)をつなぐコマンドラインインタプリタ。コマンドの実行や、テキスト形式のスクリプト作成が可能です。 プロセス(Process): ユーザーがシステム上で実行するあらゆるタスクのこと。単なる「タスク」より少し複雑な概念です。 ファイル(File): ハードディスク(HDD)上
-
シェルスクリプトで構文チェックのデバッグモードを実行する方法
シェルスクリプトのデバッグシリーズでは、これまでにさまざまなデバッグオプションの種類と、シェルスクリプトのデバッグモードを有効にする方法を解説してきました。 シェルスクリプトを書き終えたら、実行前に必ずスクリプトの構文を実際にチェックすることをおすすめします。出力結果を見て動作が正しいかどうかを確認するよりも、事前に構文エラーを検出する方が効率的だからです。 この記事では、構文チェック(シンタックスチェック)デバッグモードの使い方について詳しく見ていきます。前回の記事で説明した各種デバッグオプションを思い出しながら、実際にスクリプトのデバッグを行ってみましょう。 冗長(Verbose)デバッグ