2016.
05.
01
01:10:42
結論から書くと
・「#!/bin/sh」と書く → shっぽい挙動をする
・「#!/bin/bash」と書く → bashっぽい挙動をする
です。
つまり、(運が悪いと)挙動に違いが出ます。
例え「/bin/sh」が「/bin/bash」のシンボリックリンクでもね。
それでは、詳細を書いていきます。
ちょっくら、Linux関連のファイルを調べていてですね。
私の環境では「/bin/sh」が「/bin/bash」のシンボリックリンクになっていました。
そこで、ふと、シェルスクリプトの1行目に書くのは
でも
でも良いのかな?と気になったのが、今回のきっかけです。
いつも何も考えずに「#!/bin/sh」って書いてるけど
「#!/bin/bash」にした方が良いのかな?と不安になったのです。
ちなみに
ls -l /bin/sh
の実行結果は
でした。
「/bin/sh」は「/bin/bash」のシンボリックリンクです。
さぁ、どうなる?
ほんで、あれやこれやと調べたところbashのマニュアル(man bash)に
と書いてありました。
ふむふむ。
ざっくり訳すと
「sh」って名前でbashを動かすと、できるだけ昔のshっぽく動くよ
ってことですかね。
なるほど。
「#!/bin/sh」と書くと、bashのくせにshの振りをするのか。
それを踏まえて、実験してみます。
以下の2つのスクリプトファイルを用意しました。
違いは1行目だけです。
test01.shの1行目が「#!/bin/sh」になっているのに対し、
test02.shの1行目は「#!/bin/bash」になっています。
■test01.sh
■test02.sh
それぞれ実行したところ、結果は以下のようになりました。
■test01.sh
■test02.sh
test01.shはファイルの読み込みエラーが発生した時点で処理が終了しています。
test02.shはエラーが発生しても最後まで処理が進みました。
ふむ、確かに挙動が違いますね。
ということで「#!/bin/sh」と書くか「#!/bin/bash」と書くかで挙動は変わるようです。
bashのマニュアルによると
・「#!/bin/sh」と書く → shっぽい挙動をする
・「#!/bin/bash」と書く → 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"
# ファイル読み込みエラー
. hoge.txt
echo "end"
■test02.sh
#!/bin/bash
# ファイル読み込みエラー
. hoge.txt
echo "end"
# ファイル読み込みエラー
. hoge.txt
echo "end"
それぞれ実行したところ、結果は以下のようになりました。
■test01.sh
./test01.sh: 4 行: .: hoge.txt: ファイルが見つかりません
■test02.sh
./test02.sh: 行 4: hoge.txt: そのようなファイルやディレクトリはありません
end
end
test01.shはファイルの読み込みエラーが発生した時点で処理が終了しています。
test02.shはエラーが発生しても最後まで処理が進みました。
ふむ、確かに挙動が違いますね。
ということで「#!/bin/sh」と書くか「#!/bin/bash」と書くかで挙動は変わるようです。
bashのマニュアルによると
・「#!/bin/sh」と書く → shっぽい挙動をする
・「#!/bin/bash」と書く → bashっぽい挙動をする
らしいですよ。
そんな感じ\(--)/