シェルスクリプトの拡張子「.sh」と「.bash」の違い
Linux環境で作業をしていると、xxx.sh という名前のシェルスクリプトをよく見かけます。
一方で、配布されているツールやスクリプトの中には、
xxx.bash
のように .bash という拡張子が付いているものもあります。
「.sh と .bash は何が違うのか?」
「.sh なのに中身が #!/bin/bash なのはなぜなのか?」
という疑問を持つことがあります。
.sh はシェルスクリプト全般を表す慣習
まず、.sh という拡張子は sh専用という意味ではありません。
Linuxでは昔から、
backup.sh check_service.sh monitor.sh
のように、シェルで実行するスクリプトに .sh を付けることが一般的です。
これはあくまで「シェルスクリプトですよ」という識別のためであり、実際にどのシェルで動くかは別の話になります。
実際に使用するシェルを決めるのは先頭行
シェルスクリプトの先頭には、以下のような記述があります。
#!/bin/bash
これは shebang(シバン)と呼ばれ、このスクリプトを実行するインタプリタを指定しています。
例えば、
#!/bin/bash echo "backup start"
という内容なら、ファイル名が、
backup.sh
であっても、これは Bash 用のスクリプトです。
つまり、
backup.sh
という名前だけでは、sh用なのかbash用なのかは判断できません。
なぜ .sh なのに #!/bin/bash なのか
実際の運用現場では、
backup.sh
という名前で、
#!/bin/bash
から始まるスクリプトはよくあります。
理由は、Bashには sh より便利な機能が多いためです。
例えば、
- 配列
[[ ]]による条件判定- 拡張された変数展開
sourceによる設定ファイル読み込み
などが利用できます。
そのため、運用スクリプトでは Bash を指定するケースが多くあります。
.bash という拡張子も存在する理由
一方で、
xxx.bash
というファイル名も存在します。
これは「このファイルは Bash 専用です」と、作成者が分かりやすくするために付けている場合が多いです。
例えば、配布されているツールで、
install.bash setup.bash
のような名前を見ることがあります。
これは利用者に対して、
「このスクリプトは Bash 前提です」
という意図を伝える役割があります。
ただし、.bash だから特別な実行形式になるわけではありません。
例えば、
test.sh test.bash
どちらでも、中身が、
#!/bin/bash
なら Bash スクリプトです。
実行方法には注意
実行方法によって動作が変わる場合があります。
推奨される実行方法
./backup.sh
または、
bash backup.sh
この場合は Bash で実行されます。
注意が必要な実行方法
sh backup.sh
これは sh を明示的に指定しているため、先頭の
#!/bin/bash
は無視されます。
Bash専用の構文を使っている場合、環境によってはエラーになることがあります。
まとめ
.shはシェルスクリプト全般を表す慣習であり、sh専用ではない.bashは Bash 専用であることを明示するために使われることがある- 実際に利用するシェルは shebang(
#!/bin/bashなど)で決まる - 実行時に
sh script.shとすると shebang は無視される - ファイル名だけではなく、先頭行と実行方法を確認することが重要
シェルスクリプトを扱う際は、拡張子だけで判断せず、まず #!/bin/~ を確認することがトラブル防止になります。

