43293


**Q1.bashはshの上位互換ですか？**  
・shでは出来るけれども、bashでは出来ないことはありますか？

* * *

**Q2.「#!/bin/sh」と「#!/bin/bash」について**  
・下記3つあると思うのですが、それぞれ何れに該当しますか？

[code]

    ・シェルスクリプト
    ・bash posix モード
    ・bash
    
[/code]

・「#!/bin/bash」は「bash」？  
・「#!/bin/sh」は「シェルスクリプト」？ それとも「bash posix モード」？

* * *

**環境**  
・CentOS


CC BY-SA 3.0
2018-04-15T15:26:25.370
43277
2018-04-16T11:06:14.853
2018-04-15T22:28:51.493
19110
7886
question
bash sh
shとbashについて


> Q1.bashはshの上位互換ですか？

最初に[Difference between sh and
bash](https://stackoverflow.com/q/5725296)という質問を見つけたので紹介しておきます。

bashはshを基礎にして開発されています。できるだけshのように振る舞うこともできますし、shにない機能がbashにはあります。そういう意味では上位互換であると言えそうです。  
一方、dashやashを始めとした様々なシェルが同じようにshを基礎にして開発されています。  
それらのシェルがbashをshの上位互換とするか――shではなくbashを基礎にするかというとそうではないでしょう。

> Q2.「#!/bin/sh」と「#!/bin/bash」について

ざっくりした説明ですが、シェルスクリプトはシェルが解釈して実行できるように書かれたスクリプトです。  
ファイルの先頭に書かれる`#!/bin/sh`とか`#!/bin/bash`はshebangと呼ばれていて、そのファイルに書かれたスクリプトを解釈して実行するシェルを指定しています。(前者ならshが、後者ならbashが呼ばれます。)

もし`readlink /bin/sh`の結果が`bash`だった場合に`#!/bin/sh`がどういう動作をするのかについては`man
bash`の起動セクションに書かれています。

> (前略)  
>  sh という名前で bash を起動すると、 bash は古くからある sh の起動動作をできるだけ真似しようとします。 また POSIX
> 標準にもできるだけ従おうとします。対話的なログインシェルとして起動されると、 あるいは --login
> オプション付きの非対話的シェルとして起動されると、 このシェルはまず /etc/profile と ~/.profile
> の順でコマンドの読み込みと実行をしようとします。 --noprofile オプションを使うと、この動作を行わないようにできます。 sh
> という名前の対話的シェルとして起動されると、 bash は環境変数 ENV を調べ、この変数が定義されていればその値を展開し、
> 展開で得た値をコマンドの読み込みと実行を行うためのファイル名として使います。 sh という名前で起動されたシェルは、
> ほかの起動ファイルからコマンドの読み込みと起動を行うことはないので、 --rcfile オプションは全く効果を持ちません。 sh
> という名前の非対話的シェルとして起動されると、 このシェルはほかの起動ファイルを何も読み込みません。 sh として起動された場合、 bash
> は起動ファイルの読み込みを行った後に POSIX モードに入ります。  
>  (後略)

詳細を確認するためにも`man bash`してみることをお勧めします。


CC BY-SA 3.0
2018-04-16T04:55:06.077
43285
2018-04-16T04:55:06.077
25936
43277
answer


`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 のみのようです。(探せばあるのかも・・・)


CC BY-SA 3.0
2018-04-16T11:06:14.853
43293
2018-04-16T11:06:14.853
5008
43277
answer