🐭
`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