シェルスクリプトによくある1行目の「#!」の意味

要約

Shebang(シェバング)という。

~~CUIからファイル名を直接叩いた際、基本的にはそのファイルにはマシン語が記述されている前提で解釈される。~~ただしUnixはファイルが「#!」から始まっている際は、その後に記述されているコマンド経由でファイルが実行される。

**(追記)**Macの動作を見たところ、Shebangなしシェルスクリプトを直接ファイル名叩いても動作したので、マシン語前提というわけではないみたい。

npm install -gしたパッケージは当然JavaScriptで記述されてるんだけど、例えばcsscombがなんでCUI上でnode csscombじゃなくcsscombだけで動くかというとShebangが記述されているから。

詳細

よくあるのはこんなの

#!/bin/sh

echo 'hoge';

よく「シェルスクリプトを書く際のおまじない」的な感じで説明されてる。実際には前述の通り、ファイル名を叩いた際に「/bin/sh」経由でファイルが実行される。

これはシェルスクリプトにかぎらず、node.js等インタプリタ上で動かす前提のファイルにも適用出来て、例えば

#!/usr/local/bin/node

console.log('hoge');

という内容の「hoge」ファイルを作った場合

./hoge

だけでnode.js上でファイルが実行される。(もちろんShebangなしでは動作しない)

なお、/usr/local/bin/nodeと書いたが、実際にはユーザーがどこにnodeを入れているのかわからないので

#!/usr/bin/env node

console.log('hoge');

という風に書いて各ユーザーの環境変数を読み込んで実行する。

参考

#!/bin/sh は ただのコメントじゃないよ! Shebangだよ! - Qiita

いまさら聞けない、#! で始まる1行目の名前とenv指定時の挙動 - プログラマ 福重 伸太朗 ~基本へ帰ろう~