web-dev-qa-db-ja.com

Debian-bashはデフォルトのシェルですが、「mansh」はダッシュを与えます

Debianスクイーズについて。 _ps -p $$_を実行すると、bashが現在のシェルであり、ls -l $(which sh)shbashへのシンボリックリンクであることを示します。では、なぜ_man sh_を実行すると、dashのマニュアルページが表示されるのでしょうか。これはDebianの単なるバグですか?

3
ACK_stoverflow

システムのデフォルトのシェルは、ユーザーのシェルとは異なります。私のシステムでは、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のシェルフィールドをオーバーライドします。

8
derobert

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であることに依存するような起動スクリプトがあり、それらの機能を使用する可能性があることです。ただし、これらは仕様外でコーディングされたスクリプトであり、修正する必要があります。

1
Rich Homolka