本は言う:
POSIX互換モードの場合、-bashはshをエミュレートします。
これは何を意味するのでしょうか?簡単な素人用語でのエミュレーションとはどういう意味ですか?
これはLinuxの問題ではなく、bashの問題です。 Bashは多くのシェルの1つです。 Bashは「Bourne again Shell」であり、元のBourne Shell sh
の代わりとしてリリースされました。
POSIXは、POSIX準拠システムの動作方法を定義する一連の標準です。 POSIX Shell標準は here にあります。 Bashにはsh
にはない多くの機能があり、実際にはPOSIX準拠のシェルではありません。
これが--posix
オプションが提供されている理由です。 man bash
(エンファシスマイニング)で説明されているように:
Shという名前でbashが呼び出されると、POSIX標準にも準拠しながら、shの歴史的なバージョンの起動時の動作を可能な限り模倣しようとします。対話型ログインシェル、または--loginオプションを使用した非対話型シェルとして起動すると、最初に/ etc/profileおよび〜/ .profileからこの順序でコマンドを読み取って実行しようとします。 --noprofileオプションを使用して、この動作を禁止できます。 bashは、shという名前の対話型シェルとして呼び出されると、変数ENVを探し、定義されている場合はその値を展開し、展開された値を読み取りおよび実行するファイルの名前として使用します。 shとして起動されたシェルは他のスタートアップファイルからコマンドを読み取って実行しようとしないため、-rcfileオプションは効果がありません shという名前で呼び出された非対話型シェルは、他のスタートアップファイルを読み取ろうとしません。 shとして呼び出されると、bashは起動ファイルが読み取られた後にposixモードに入ります。
--posixコマンドラインオプションと同様に、bashをposixモードで起動すると、起動ファイルのPOSIX標準に従います。このモードでは、対話型シェルはENV変数を展開し、コマンドは名前が展開された値であるファイルから読み取られて実行されます。他の起動ファイルは読み込まれません。
つまり、sh
、またはbash --posix
を実行して対話型シェルを起動すると、~/.bahsrc
ファイルは無視され、代わりに$ENV
(存在する場合)として保存されたファイルが読み取られます。説明のために、echo "read .bashrc"
を~/.bashrc
に追加しました。
$ bash
read .bashrc ## message was printed, ~/.bashrc was read
$ sh
sh-4.3$ ## no message printed, ~/.bashrc was not read
ここで$ENV
を設定すると:
$ export ENV="~/.bashrc"
$ sh
read .bashrc
重要な注意:Ubuntuは/bin/sh
を/bin/dash
へのシンリンクにすることを選択しました。 Dashはさらに別のシェルであり、実際にはPOSIX準拠のシェルです。つまり、上記の動作を観察するには、別のsh
を使用する必要があります1。 Ubuntuでは、/bin/bash
へのシンボリックリンクであるsh
というファイルを作成する必要があります。
$ ln -s /bin/bash ~/sh
これで、ホームディレクトリにsh
というファイルが作成されました。それを使用して、上記で説明した違いを示します。
$ ls -l ~/sh
lrwxrwxrwx 1 terdon terdon 9 May 2 14:03 /home/terdon/sh -> /bin/bash
$ ~/sh
read .bashrc
1実際には、振る舞いは同じように見え、~/.bashrc
は無視されますが、それはdash
がbash
ではなく、bash固有の~/.bashrc
を読み取るビジネスがないからです。ただし、dash
も$ENV
を無視するため、/bin/bash
へのリンクを使用して確認する必要があります。