🐭
`sh` と `bash` の違い
#!/bin/sh
#!/bin/bash
どちらもシバンであるが、微妙に挙動が異なる。set -euo pipefail
効いてなくない?なんてことに遭遇もしたので調べてみた。
sh
と bash
の違い
項目 |
sh (Bourne Shell) |
bash (Bourne Again Shell) |
---|---|---|
正式名称 | Bourne Shell | Bourne Again Shell |
開発者 | Stephen Bourne(AT&T) | GNUプロジェクト |
登場時期 | 1979年(UNIX V7) | 1989年(GNU Bash 1.0) |
互換性 | POSIX準拠、他シェルへの基本互換性を重視 |
sh 互換だが、独自拡張あり |
機能の豊富さ | 最低限の構文・制御構造 | より強力な機能(配列、連想配列、コマンド補完など) |
スクリプトの互換性 | より制限が多く、移植性が高い | 拡張機能を使うと他のシェルでは動かない可能性あり |
対話型機能 | 限定的 | ヒストリ、補完、プロンプト装飾などが充実 |
一般的な用途 | POSIX環境での移植性重視スクリプト | Linux環境での通常使用や高度なスクリプト |
補足ポイント
- 多くのLinuxディストリビューションでは、
/bin/sh
はbash
やdash
などへのシンボリックリンクになっていることが多いです。 -
#!/bin/sh
と記述したスクリプトは、Bashで実行されているように見えても、**制限されたモード(POSIXモード)**で動作する場合があります。 -
bash
で書いたスクリプトをsh
で動かすと、構文エラーや未定義動作になることがあります(例:配列や[[ ]]
構文など)。
どちらを使うべきか?
-
可搬性重視(他OSやシステムでも動かしたい):
sh
-
Linux前提・機能重視・日常のスクリプト作成:
bash
必要であれば、具体的な構文の違い例も紹介できます。
Discussion