Debianスクイーズについて。 _ps -p $$
_を実行すると、bash
が現在のシェルであり、ls -l $(which sh)
がsh
がbash
へのシンボリックリンクであることを示します。では、なぜ_man sh
_を実行すると、dash
のマニュアルページが表示されるのでしょうか。これはDebianの単なるバグですか?
システムのデフォルトのシェルは、ユーザーのシェルとは異なります。私のシステムでは、dash
がシステムのデフォルトですが、ログインするときにbash
を使用します。
anthony@Zia:~$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 1 2012 /bin/sh -> dash
したがって、#!/bin/sh
を上にしたシェルスクリプトはダッシュで実行されます。
/ bin/shシンボリックリンクとマンページシンボリックリンクが同期しなくなったため、システムになんらかの理由があるようです。私のシステムのマンページシンボリックリンクは次のとおりです。
anthony@Zia:~$ ls -l /usr/share/man/man1/sh.1.gz
lrwxrwxrwx 1 root root 9 Mar 1 2012 /usr/share/man/man1/sh.1.gz -> dash.1.gz
/ bin/shを手動で変更した場合は、それも変更する必要があります。これらのシンボリックリンクの処理にもバグがある可能性があります。 mpyは指摘します Bug#662159 。
各ユーザーには、ログイン時にシェルを呼び出す設定があります。これはユーザーごとの設定であり、/etc/passwd
に格納されているため、システム全体のマンページに反映することはできません。各ユーザーは、chsh
を実行して自分のシェル設定を変更できます(もちろん、rootは他のユーザーのシェル設定を変更できます)。
ログイン時に設定されるShell
環境変数もありますが、変更することができます。通常、xterm
がシェルを開始する必要がある場合などに、/etc/passwd
のシェルフィールドをオーバーライドします。
TL; DR/ bin/shは他のUNIX(Solaris)では完全に異なるシェルでしたがLinuxではBashでしたが、Debianは カスタム/ bin/shシェル さまざまな理由(主にコードサイズ)。
元のシェルはBourneShellでした。 POSIXルールでは、Bourne互換シェルが/ bin/shとしてインストールされている必要があります。これは、man sh
を要求したときに得られるものです。
BourneShellは実際にはかなり生でした。コマンドインタープリターに必要なインタラクティブ機能はあまりありませんでした。履歴メカニズムやエイリアスなどはありませんでした。そのため、いくつかの追加が行われました。最初にこれはtcshで、次にKorn Shellで、次にBashで行われました。
Linuxディストリビューションを作成するときは、/ bin/shのPOSIXルールに従う必要があります。彼らは「BourneShellからのShell前方互換性のあるBashがあります」を見ました。いくつかの機能を削除して/ bin/shとしてインストールしてみませんか?ほとんどのディストリビューションはこれを行いました。
しかし、これにはいくつかの問題があります。 Bashには多くの機能(readlineバインディング、プログラム可能な補完、辞書配列など)があり、実際にはメモリ上でかなり大きく、ライブラリの依存関係がいくつかあります。 「システムが中断している」モードの場合、これらは特に適切ではありません。その時点で完全にプログラム可能なプロンプトがあるかどうかを心配するよりも、システムを起動することに関心があります。
そのため、Debianの人々は未来に戻り、/ bin/shとして特殊なストリップされたBourneShellを持っています。それはより小さく、依存関係が少なく、理論的には起動時の信頼性が高くなります。欠点は、/ bin/shが実際にBashであることに依存するような起動スクリプトがあり、それらの機能を使用する可能性があることです。ただし、これらは仕様外でコーディングされたスクリプトであり、修正する必要があります。