#!/bin/sh と #!/bin/bash の違い

(2025-12-16)

シェルスクリプトは難解ですがとても便利なものです。

例えば、あらゆる動画を mp4 に変換して一部を静止画にするシェルスクリプトは、自宅サーバー上にデジタルアルバムを作成しているので頻繁に使います。

#!/bin/sh
for ext in mkv mp4 webm MP4 MOV; do
for file in before/*."$ext"; do
[ -f "$file" ] || continue
basename=$(basename "$file")
fname="${basename%.*}" # 拡張子除去
ffmpeg -i $file -pix_fmt yuv420p ./after/$fname.mp4
ffmpeg -i $file -ss 1 -t 1 -r 1 -f image2 ./after/$fname.png
done
done

しかし、先頭に書く文字列には #!/bin/sh と #!/bin/bash があり違いについて調べることはありませんでした。

シェバン(shebang)

シェルスクリプトの一行目に書かれる #!/bin/sh をシェバン(shebang)といいますが、その語源に関してネット上には

#(ハッシュ:hash/シャープ:sharp) と !(バン:bang) を縮めて、shebang と言われるようになりました。

という情報が多いようですが、chatGPT によると、

shebang(シェバン) はもともと「全部」「一式」「全体」という意味の 英語の俗語 です。 #(hash)+ !(bang)は hashbang だが発音しにくいために shebang と発音するようになった、つまり偶然意味が重なって定着したと思ってOKです。

そもそも「シェル」ってなに?

シェルとは、

人の命令を、コンピュータがわかる形に通訳してくれるもの

例えば、あるファイル(sample.txt)を削除する命令は、

Terminal window
rm sample.txt

ですが、それを通訳してくれるものがシェルです。

sh と bash の違い

sh と bash の違いは、指定している シェルの種類 の違いです。

項目#!/bin/sh#!/bin/bash
指すシェルsh(POSIXシェル)bash(Bourne Again Shell)
互換性高い(POSIX準拠)bash専用機能あり
機能最小限高機能
移植性非常に高い環境依存しやすい

例えて言うと、sh は自転車で bash は自動車という感じです。bash の方が遥かにパワフル。

でも、bash は他のシステムへの移植性は高くはありません。

POSIX シェルと Bourne Again Shell

むかし(1970〜80年代)Unix というOSが流行しました。 会社ごとに少しずつ違うUnixが増えていきましたが、互換性がなくなってしまい他のシステムでは動作しませんでした。

そこで、最低限これだけは共通化しようとして誕生したのが POSIX = Portable Operating System Interface です。

Bourne Again Shell(ボーン・アゲイン・シェル)とは、昔からある「sh」を、現代向けに作り直したシェルです。

Bourne Shell(sh) を作ったのは Stephen Bourne という人ですが、Bourne Again Shell とは「Bourne Shell が生まれ変わったシェル」という意味です。

これは、born again(キリスト教の「新生」)にかけたダジャレのようです。

linux だけで完結するのであれば bash でパワフルに、他のシステムやサーバー上で動かす場合には sh でというのがいいようです。