shebang 行とは何か? インタープリタを選ぶ
shebang 行は、#! で始まるスクリプトの最初の行で、どのインタープリタがファイルを実行すべきかをオペレーティングシステムに伝えます。
スクリプトを直接実行するとき、オペレーティングシステムはどのプログラムがそれを解釈すべきかを知る必要があります。Bash、Python、Node、あるいは他の何かです。shebang 行がそれに答えます。それは小さいながらも重要な詳細であり、どのシェルまたはインタープリタ、したがってどの機能を CI スクリプトが得るかを決定します。
shebang の見た目
それはまさに最初の行で、2 文字の #! に続いてパスが来ます。たとえば #!/bin/bash や #!/usr/bin/env python3 です。ファイルを直接実行すると OS がそれを read します。
どう使われるか
./script.sh を実行すると、カーネルは shebang を見て、指定されたインタープリタを起動し、ファイルを渡します。shebang がないと、OS はデフォルトのシェルにフォールバックする可能性があり、それは意図したものではないかもしれません。
env ベースの shebang
#!/bin/bashは Bash への固定パスを指す。#!/usr/bin/env bashは PATH 経由で Bash を見つけ、より移植性が高い。#!/usr/bin/env python3は Python インタープリタに対して同じことを行う。
shebang が重要な理由
shebang は、スクリプトが sh で実行されるか bash で実行されるかを決定し、それにより利用可能な機能が変わります。Bash の配列を使うスクリプトは、その shebang がプレーンな POSIX シェルに解決されると壊れます。
CI における shebang
CI はしばしばスクリプトを明示的に呼び出し (bash deploy.sh)、これは shebang をオーバーライドします。しかし step がチェックインされたスクリプトを直接呼び出すときは、shebang がインタープリタを制御するので、正しく設定することでローカルと CI の実行を一貫させられます。
managed runner での一貫性
Latchkey runner はインタープリタを予測可能な場所に提供するので、#!/usr/bin/env bash shebang は毎回同じように解決されます。これにより、直接実行されるスクリプトが CI でも開発者のマシンでも同じように振る舞います。
重要なポイント
- shebang は、使用するインタープリタを指定するスクリプトの最初の行です。
#!/usr/bin/env bashを使うと、移植性のために PATH 経由でインタープリタを見つけます。- shebang は、直接実行されるスクリプトがどのシェル機能を得るかを決定します。