プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
CentOS 7、シェルスクリプトの1行目に「#!/bin/sh」と書いたときと「#!/bin/bash」と書いた時の挙動の違い
結論から書くと

・「#!/bin/sh」と書く → shっぽい挙動をする
・「#!/bin/bash」と書く → bashっぽい挙動をする


です。
つまり、(運が悪いと)挙動に違いが出ます。
例え「/bin/sh」が「/bin/bash」のシンボリックリンクでもね。

それでは、詳細を書いていきます。

ちょっくら、Linux関連のファイルを調べていてですね。
私の環境では「/bin/sh」が「/bin/bash」のシンボリックリンクになっていました。

そこで、ふと、シェルスクリプトの1行目に書くのは

#!/bin/sh

でも

#!/bin/bash

でも良いのかな?と気になったのが、今回のきっかけです。
いつも何も考えずに「#!/bin/sh」って書いてるけど
「#!/bin/bash」にした方が良いのかな?と不安になったのです。

ちなみに

ls -l /bin/sh

の実行結果は

lrwxrwxrwx. 1 root root 4 1月 2 11:09 /bin/sh -> bash

でした。
「/bin/sh」は「/bin/bash」のシンボリックリンクです。

さぁ、どうなる?

ほんで、あれやこれやと調べたところbashのマニュアル(man 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.

と書いてありました。

ふむふむ。
ざっくり訳すと

「sh」って名前でbashを動かすと、できるだけ昔のshっぽく動くよ

ってことですかね。

なるほど。
「#!/bin/sh」と書くと、bashのくせにshの振りをするのか。

それを踏まえて、実験してみます。

以下の2つのスクリプトファイルを用意しました。
違いは1行目だけです。
test01.shの1行目が「#!/bin/sh」になっているのに対し、
test02.shの1行目は「#!/bin/bash」になっています。

■test01.sh
#!/bin/sh

# ファイル読み込みエラー
. hoge.txt

echo "end"

■test02.sh
#!/bin/bash

# ファイル読み込みエラー
. hoge.txt

echo "end"

それぞれ実行したところ、結果は以下のようになりました。

■test01.sh
./test01.sh: 4 行: .: hoge.txt: ファイルが見つかりません

■test02.sh
./test02.sh: 行 4: hoge.txt: そのようなファイルやディレクトリはありません
end

test01.shはファイルの読み込みエラーが発生した時点で処理が終了しています。
test02.shはエラーが発生しても最後まで処理が進みました。

ふむ、確かに挙動が違いますね。

ということで「#!/bin/sh」と書くか「#!/bin/bash」と書くかで挙動は変わるようです。
bashのマニュアルによると

・「#!/bin/sh」と書く → shっぽい挙動をする
・「#!/bin/bash」と書く → bashっぽい挙動をする


らしいですよ。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● Linux  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事