質問: **Q1.bashはshの上位互換ですか?** ・shでは出来るけれども、bashでは出来ないことはありますか? --- **Q2.「#!/bin/sh」と「#!/bin/bash」について** ・下記3つあると思うのですが、それぞれ何れに該当しますか? ``` ・シェルスクリプト ・bash posix モード ・bash ``` ・「#!/bin/bash」は「bash」? ・「#!/bin/sh」は「シェルスクリプト」? それとも「bash posix モード」? --- **環境** ・CentOS
回答: `sh` というと伝統的なB-Shellのことをイメージしますが、ご質問のCentOS環境では `sh` と `bash` は同じコマンドです。`/bin/sh` は `/bin/bash` のシンボリックリンクなので `sh` といいならがらも `bash` が動きます。 > > Q1.bashはshの上位互換ですか? > > ・shでは出来るけれども、bashでは出来ないことはありますか? > > > こちらについてはわかりません(あしからず)。 > > Q2.「#!/bin/sh」と「#!/bin/bash」について > > ・下記3つあると思うのですが、それぞれ何れに該当しますか? > > ・シェルスクリプト > > ・bash posix モード > > ・bash > > > `#!` で始まる行は shebang といいます。そのスクリプトファイルを実行するインタプリタを指定する書き方です。シェルスクリプトはシェルの文法で書かれたスクリプトファイル全般のことです。 CentOS環境では `/bin/sh` `/bin/bash` どちらも`bash`です。ただし、`sh` という名前で実行した場合は POSIXモードの振る舞いをします。 manpage of bash より引用 > > If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well. > > > ただし、bash独自の「配列」は posixモードでも使えます。従って、posixモードで正常に動作する `/bin/sh` スクリプトが全ての環境の `sh` で動作するわけではありません。 > > ・「#!/bin/bash」は「bash」? > > > shebang に /bin/bash を指定していますので、そのスクリプトはbashによって実行されます。 > > ・「#!/bin/sh」は「シェルスクリプト」? それとも「bash posix モード」? > > > shebang に /bin/sh を指定してますが、CentOS環境ではbashのPOSIXモードで実行されます。 なお、以前の Centos では POSIX準拠のB-Shellの代用として Almquist Shell (ash) が 用意されていましたが、Centos6以降ではパッケージングされておらず bash のみのようです。(探せばあるのかも・・・)