[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

/usr/bin/sh

pointこの用語のポイント

pointファイルだよ

pointUNIX系のOSで使われるよ

pointbashのシンボリックリンクだよ

pointshっぽい動き方をするよ

スポンサーリンク

簡単に書くよ

/usr/bin/shとは

UNIX系のOS(LinuxとかMacとか)で使われるシェル「bash」のシンボリックリンク
であり

bashのくせに、できるだけshっぽい動きをしようとするやつ
です。

image piyo

詳しく書くよ

※このページの説明は「/bin/sh」の説明と、ほとんど同じです。既に「/bin/sh」の説明をご覧になった方は、読んでもあまり意味は無いと思います。

まずは予備知識から行きましょう。

シェルは「人間様からの入力をコンピュータさんに伝えるプログラム」ね。

/usr/bin/sh

コンピュータを1つの会社に例えれば、シェルは受付のおねーさんです。

/usr/bin/sh2

ついでなので書いておくと、コンピュータを使う人間が会社への訪問者、パソコンの中身が会社で働いている人に相当します。

/usr/bin/sh3

あなたがパソコンの中身と直接やり取りをすることはありません。
あなたがやり取りする相手は、シェルです。
シェルがあなたの代わりに、パソコンの中身とやり取りしてくれます。

/usr/bin/sh4

シェルの詳細は用語「シェル」の説明をご覧ください。

さて、このシェルですが、いろいろあります。

受付のおねーさんが複数人いるイメージです。
相手をしてくれるおねーさんは1人ですけどね。
2人以上のおねーさんが待機していて、あなたは好きなおねーさんを選べます。
また、途中で、相手をしてくれるおねーさんを変えることもできます。

実際のシェルは

sh
bash
ksh
csh
tcsh
zsh


などです。
いろいろありますが、今回は「sh」と「bash」が関係してきます。

あとは「シンボリックリンク」の説明もしておきましょう。
シンボリックリンクは「ファイルフォルダの代理人ファイル」です。
Windowsの方が詳しい人は「ショートカット」みたいなものだと思ってください。

例えば、ファイルAのシンボリックリンクA’があるとしましょう。

/usr/bin/sh5

このシンボリックリンクA’を開こうとすると、ファイルAが開きます。
ファイルAを直接開いたのと同じ結果です。

/usr/bin/sh6

シンボリックリンクは、自分がそのファイルやフォルダであるかのように振る舞います。
ただし実際には、ただの成りすましです。
「おーい!ちょっくら来ておくれ~!」と呼び出されると、成りすまし元に「呼ばれてるよ!早く行きなよ!」と押しつけます。

/usr/bin/sh7

以上が予備知識です。

ここまでを踏まえて、bashの本体ファイルである「/usr/bin/bash」のシンボリックリンクが「/usr/bin/sh」です。

「usr」ディレクトリの中の「bin」ディレクトリの中の「sh」ファイルで「/usr/bin/sh」ね。
UNIX系のOSLinuxとかMacとか)で使われるファイルです。

/usr/bin/sh8

私の環境

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/sh9

「/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っぽく動きます。

プログラムを「使う」立場の人は忘れてしまっても構いません。
プログラムを「作る」立場の人は頭の片隅に置いておいてください。

image piyo2

一言でまとめるよ

まぁ「/usr/bin/sh」って単語が出てきたら「shっぽい挙動をする、bashのシンボリックリンクなんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク