🐭

`sh` と `bash` の違い

に公開
  • #!/bin/sh
  • #!/bin/bash

どちらもシバンであるが、微妙に挙動が異なる。set -euo pipefail効いてなくない?なんてことに遭遇もしたので調べてみた。

shbash の違い

項目 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/shbashdash などへのシンボリックリンクになっていることが多いです。
  • #!/bin/sh と記述したスクリプトは、Bashで実行されているように見えても、**制限されたモード(POSIXモード)**で動作する場合があります。
  • bash で書いたスクリプトを sh で動かすと、構文エラーや未定義動作になることがあります(例:配列や[[ ]]構文など)。

どちらを使うべきか?

  • 可搬性重視(他OSやシステムでも動かしたい)sh
  • Linux前提・機能重視・日常のスクリプト作成bash

必要であれば、具体的な構文の違い例も紹介できます。

Discussion