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

/usr/bin/sh

pointこの用語のポイント

pointファイルだよ

pointUNIX系のOSで使われるよ

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

pointshっぽい動き方をするよ

スポンサーリンク

簡単に書くよ

/usr/bin/shとは

UNIX系のOS(コンピュータの人格に相当するソフト)(Linuxとか)で使われるシェル(人間様からの入力をコンピュータさんに伝えるプログラム)「bash」のシンボリックリンク(ファイルやフォルダの代理人ファイル)
であり

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


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として「シェル」と「シンボリックリンク」について簡単に説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

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

/usr/bin/sh

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

/usr/bin/sh2

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

/usr/bin/sh3

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

/usr/bin/sh4

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

/usr/bin/sh5

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

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

実際のシェルは

sh
bash
ksh
csh
tcsh
zsh


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

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

/usr/bin/sh6

例えば、そうですね。
ファイルAのシンボリックリンクA’が あったとしましょう。

/usr/bin/sh7

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

/usr/bin/sh8

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

/usr/bin/sh9

以上を踏まえて

bashの本体ファイルである「/usr/bin/bash」のシンボリックリンク

が「/usr/bin/sh」です。

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

/usr/bin/sh10

私の環境

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

「/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のシンボリックリンク(ファイルやフォルダの代理人ファイル)なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像058
書籍画像004


書籍画像
わわわ説明術コラム
宣伝だよ
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本
AI用語図鑑 ビジネス・開発・試験対策に使える厳選キーワード256
実践サイバーセキュリティ入門講座 現場に残された痕跡からハッカーの攻撃を暴け