3秒でわかる
スクリプトの1行目に書く記号の記述。どのインタープリタで実行するかをカーネルへ伝え、ファイルを直接実行できるようにします。
もう少し詳しく
どういうものか
シバンは、スクリプトファイルの1行目に書く #! と、それに続くインタープリタのパスのことです。#!/bin/bash と書いてあれば、そのファイルはbashで解釈されます。この2文字はファイルの先頭になければならず、前に空行やコメントがあると単なるコメント行として無視されます。
なぜ必要か
シバンがあると、スクリプトを普通のコマンドと同じように実行できます。bash deploy.sh や python3 tool.py と毎回書く必要がなくなり、./deploy.sh で動きます。cronやsystemdからの起動、xargs からの呼び出しなど、実行方法を書き添えられない場面でも正しいインタープリタが選ばれます。
具体例
#!/usr/bin/env bash
set -euo pipefail
echo "start"# 実行権限が無いとシバンがあっても動かない
chmod +x deploy.sh
./deploy.sh
# カーネルが何を見ているかを確かめる
head -c 2 deploy.sh # => #!
file deploy.sh # => Bourne-Again shell script, ASCII text executablePythonなら #!/usr/bin/env python3 と書きます。env を挟むのは、環境ごとに実行ファイルの場所が違ってもPATHから探してくれるためです。/usr/bin/python3 と直書きすると、仮想環境のPythonではなくシステムのPythonが使われます。
つまずきやすいところ
最も多い失敗は改行コードです。Windowsで編集したファイルはCRLFになり、#!/bin/bash の行末のCRまでパスの一部として扱われるため、bad interpreter から始まる分かりにくいエラーが出ます。file コマンドでCRLFかどうかを確認し、dos2unix などで直します。
次に多いのが実行権限の付け忘れで、こちらは Permission denied になります。エラーメッセージが違うので切り分けられます。
似た用語との違い
拡張子はあくまで人間向けの目印で、Linuxはどう実行するかの判断に使いません。判断しているのは先頭2バイトのシバンです。.sh という名前でもシバンがPythonならPythonとして動きます。
なお、シバンに渡せる引数は多くの環境で1つだけです。複数のオプションを並べても1つの文字列として扱われるため、必要な設定はスクリプト本体で行います。
実行前に1行目を目で確かめる習慣が役に立ちます。