web-dev-qa-db-ja.com

LinuxのPOSIX互換モードとは何ですか?

本は言う:

POSIX互換モードの場合、-bashshをエミュレートします。

これは何を意味するのでしょうか?簡単な素人用語でのエミュレーションとはどういう意味ですか?

3

これは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は無視されますが、それはdashbashではなく、bash固有の~/.bashrcを読み取るビジネスがないからです。ただし、dash$ENVを無視するため、/bin/bashへのリンクを使用して確認する必要があります。

8
terdon