/usr/bin/sh
ファイルだよ
UNIX系のOSで使われるよ
bashのシンボリックリンクだよ
shっぽい動き方をするよ
簡単に書くよ
/usr/bin/shとは
UNIX系のOS
(コンピュータの人格に相当するソフト)(Linuxとか)で使われるシェル
(人間様からの入力をコンピュータさんに伝えるプログラム)「bash」のシンボリックリンク
(ファイルやフォルダの代理人ファイル)
であり
bashのくせに、できるだけshっぽい動きをしようとするやつ
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として「シェル」と「シンボリックリンク」について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
シェルは「人間様からの入力をコンピュータさんに伝えるプログラム」です。
コンピュータを1つの会社に例えれば、シェルは受付のおねーさんです。
ついでなので書いておくと、コンピュータを使う人間が会社への訪問者、パソコンの中身が会社で働いている人に相当します。
あなたがパソコンの中身と直接やり取りすることは ありません。
あなたが やり取りする相手は、シェルです。
シェルが、あなたの代わりにパソコンの中身と やり取りしてくれます。
シェルの詳細は、用語「シェル」の説明を ご覧ください。
さて、このシェルですが、いろいろ あります。
受付のおねーさんが複数人いるイメージです。
相手をしてくれるのは1人ですけどね。
2人以上のおねーさんが待機していて、あなたは好きなおねーさんを選べます。
相手してくれるおねーさんを途中で変えることもできます。
実際のシェルは
・sh
・bash
・ksh
・csh
・tcsh
・zsh
などです。
いろいろありますが、今回は「sh」と「bash」が関係してきます。
シンボリックリンクは「ファイルやフォルダの代理人ファイル」です。
Windowsの方が詳しい人は「ショートカット」みたいなものだと思ってください。
例えば、そうですね。
ファイルAのシンボリックリンクA’が あったとしましょう。
シンボリックリンクA’を開こうとするとファイルAが開きます。
ファイルAを直接開いたのと同じ結果です。
シンボリックリンクは、自分がそのファイルやフォルダであるかのように振る舞います。
ただし実際には、ただの成りすましです。
「おーい!ちょっくら来ておくれ~!」と呼び出されると、成りすまし元に「呼ばれてるよ!早く行きなよ!」と押しつけます。
以上を踏まえて
bashの本体ファイルである「/usr/bin/bash」のシンボリックリンク
が「/usr/bin/sh」です。
「usr」ディレクトリの中の「bin」ディレクトリの中の「sh」ファイルで「/usr/bin/sh」ね。
UNIX系のOS(LinuxとかMacとか)で使われるファイルです。
私の環境で
ls -l /usr/bin/sh
を実行したところ、以下の結果が表示されました。
lrwxrwxrwx. 1 root root 4 1月 2 11:09 /usr/bin/sh -> bash
この結果のうち
/usr/bin/sh -> bash
の部分に注目してください。
これは
「/usr/bin/sh」は「bash」のシンボリックリンクだからね!
を意味しています。
「/usr/bin/sh」を起動すると、実際には「/usr/bin/bash」が動き出します。
「/usr/bin/bash」はシェル「bash」の本体ファイルです。
つまり「/usr/bin/sh」を動かすと、シェル「bash」が起動します。
以上が「/usr/bin/sh」の基本的な説明です。
次に、もう少しだけ、ややこしい部分を説明します。
「そろそろ頭が痛いんだけど?」な人は、ここで読むのを止めても かまいません。
基本的な部分は説明しました。
……。
あっ、読んでくださるのですね。
それでは書いていきます。
「/usr/bin/sh」は「/usr/bin/bash」のシンボリックリンクです。
「/usr/bin/sh」を動かすと「/usr/bin/bash」が動きます。
つまり、シェル「bash」が起動します。
ただし「/usr/bin/sh」を動かしたときと「/usr/bin/bash」を動かしたときでは挙動が違います。
私の環境で
man bash
を実行して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っぽく動きますよ
と書いてあります。
「/usr/bin/sh」と「/usr/bin/bash」のどちらを指定しても、動き出すのは「/usr/bin/bash」です。
ただし「/usr/bin/sh」を指定したときは、bashのくせにshっぽく動くのです。
例えば、そうですね。
以下の2つのプログラム(シェルスクリプト)があるとします。
■test_sh.sh
#!/usr/bin/sh
# ファイル読み込みエラー
. hoge.txt
echo "終わり"
■test_bash.sh
#!/usr/bin/bash
# ファイル読み込みエラー
. hoge.txt
echo "終わり"
処理の内容は同じです。
どちらも
1.「/usr/bin/sh(/usr/bin/bash)」に仕事させるよ!の宣言
2.ファイル「hoge.txt」を読み込む
3.「終わり」と画面に表示する
です。
違いは1行目の書き方だけです。
「test_sh.sh」は「/usr/bin/sh」と書いています。
「test_bash.sh」は「/usr/bin/bash」と書いています。
ただし、どちらも実際に動くのは「/usr/bin/bash」です。
また留意事項として、ファイル「hoge.txt」は ありません。
「2.ファイル「hoge.txt」を読み込む」の行を実行した時点でエラーが発生します。
この2つのプログラムを実行すると、結果は以下のようになります。
■test_sh.sh
./test_sh.sh: 4 行: .: hoge.txt: ファイルが見つかりません
■test_bash.sh
./test_bash.sh: 行 4: hoge.txt: そのようなファイルやディレクトリはありません
終わり
違いが分かりますかね。
「test_sh.sh」の実行結果は「終わり」と表示されていません。
「test_bash.sh」の実行結果は「終わり」と表示されています。
言い方を変えると「test_sh.sh」はエラーが発生した時点で処理が止まっています。
「test_bash.sh」はエラーが発生しても最後まで処理が進んでいます。
どちらのプログラムも実際に動いているのは「/usr/bin/bash」です。
ただし「/usr/bin/sh」で呼び出されるか、それとも「/usr/bin/bash」で呼び出されるかで、少しだけ動きが変わるのです。
「/usr/bin/sh」で呼び出されたときは昔のshっぽく動きます。
プログラムを「使う」立場の人は忘れてしまっても かまいません。
プログラムを「作る」立場の人は頭の片隅に置いておいてあげてください。
一言でまとめるよ
まぁ「/usr/bin/sh」って単語が出てきたら「shっぽい挙動をする、bashのシンボリックリンク
(ファイルやフォルダの代理人ファイル)なんだな~」と お考えください。






