シェルスクリプトは難解ですがとても便利なものです。
例えば、あらゆる動画を 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 donedoneしかし、先頭に書く文字列には #!/bin/sh と #!/bin/bash があり違いについて調べることはありませんでした。
シェルスクリプトの一行目に書かれる #!/bin/sh をシェバン(shebang)といいますが、その語源に関してネット上には
という情報が多いようですが、chatGPT によると、
シェルとは、
例えば、あるファイル(sample.txt)を削除する命令は、
rm sample.txtですが、それを通訳してくれるものがシェルです。
sh と bash の違いは、指定している シェルの種類 の違いです。
| 項目 | #!/bin/sh | #!/bin/bash |
|---|---|---|
| 指すシェル | sh(POSIXシェル) | bash(Bourne Again Shell) |
| 互換性 | 高い(POSIX準拠) | bash専用機能あり |
| 機能 | 最小限 | 高機能 |
| 移植性 | 非常に高い | 環境依存しやすい |
例えて言うと、sh は自転車で bash は自動車という感じです。bash の方が遥かにパワフル。
でも、bash は他のシステムへの移植性は高くはありません。
むかし(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 でというのがいいようです。