追記(2026-01-24)
コメントでいただいたご指摘を参考に記事の追記修正を行いました。
貴重なご意見をありがとうございました。
はじめに
シェルスクリプトを書くとき、冒頭に以下の行を付けます。
#!/bin/bash
筆者がシェルスクリプトを習ったのは大学一年生のプログラミングの授業でした。複数のコマンドをまとめたような新しいコマンドを作ることができるということにワクワクした思い出があります。
その時、上記の様にシェルスクリプトのファイル冒頭に書く行を教わりました。これを書いておくと動くという言わば「おまじない」として教わったので、本質的な意味は知らされませんでした。
冒頭に#があるのでコメント部分になっているようですが、そのあとパスのようなものが入っているので何かしら意味があるのかな、と思っていましたが深くは調べず、なんとなく今まで使っていました。
今回はこれを「おまじない」で終わらせないために、自分なりにまとめてみました。
そもそも/bin/bashとは
このパスにcdしてみると以下のようになります。
$ cd /bin
$ ls | grep sh
bash
(中略)
sh
(後略)
xrefresh
このように、bashとかshのようなものがありました。何かしらの実行可能ファイルのようです。
また、以下のコマンドを実行するとこうなりました。
$ ls -l /bin
lrwxrwxrwx 1 root root 7 Apr 22 2024 /bin -> usr/bin
どうやら、/binは/usr/binへのシンボリックリンクのようです。
調べてみた結果、これらは簡単に言えばシェルの本体に相当するものらしいです。我々が普段使っているコマンドはこれらの/bin/bashなどに渡され、実行されるようです。
#!/bin/bashとは
※2026-01-24 コメントでいただいた指摘より追記修正しました
この行は俗に「シバン」「シェバン」と呼ばれるものです。
シェルスクリプトの冒頭に書くこの記述はコメントではなく、「インタプリタの選択」をしています。つまり、スクリプトを何に実行してもらうのかを指定しているというわけです。'!'を消すとコメント扱いになってしまうので注意が必要です。
この行の働きを見てみます。以下のようなファイルtestがあるとしましょう。
#!/bin/bash
echo 'test'
これを実行するときは以下のように記述するわけですが、
$ ./test
シバンの記述がファイルの冒頭にあると、「シェルはシバンで指定したインタプリタを呼び出し、ファイルの内容を引数として渡す」ことになります。つまり、上記の記述は以下と同義になります。
$ /bin/bash ./test
こんなこともできる
PythonやRubyなどのインタプリタ言語もこのような方法で実行させることができます。以下のファイルをscriptとして作成して保存します。
#!/usr/bin/python3
print("aaaaa")
/usr/bin/python3のところはwhich python3を実行すると得られます。
実行権限を付与した後、以下を叩くとaaaaaがprintされます。
$ ./script
上述の通り、/usr/bin/python3 ./scriptがシェルに渡されたので、Pythonが呼び出され、./scriptがPythonにより解釈・実行されたことになります。
この方法を用いると、python3 ./scriptのような書き方をしなくても、scriptというファイルを実行してやるだけでPythonプログラムが実行できるわけです。使う側から見るとファイルの記述に用いられている言語を気にせずスクリプトを実行できるほか、実行方法を書いている側が指定できるので、想定外の動作をするリスクを軽減できそうですね。
おわりに
スクリプトの作成時に実行のために用いるインタプリタを指定しているんだ、ということを初めて知ったので非常に興味深かったです。シェルスクリプト以外のインタプリタ言語を実行させることもできるようなので、応用の幅が広そうだなと感じました。
それではまた。
参考文献
/bin/sh と /bin/bash の違い - 双六工場日誌
個人的な備忘録:シェルスクリプト実行時に記述する『#!/bin/bash』について自分なりに深掘りしてみた #Linux - Qiita