shにdashまたはbashへのシンボリックリンクがあるのはなぜですか?

shにdashまたはbashへのシンボリックリンクがあるのはなぜですか?

shがbashへのシンボリックリンクであることがわかりました。

lrwxrwxrwx 1 root root 4 May  9 15:23 /bin/sh -> bash

理由を見つけようとしました。bashはshの実装です。shまたはPOSIXのように動作できます。したがって、#!/ bin / shを含むスクリプトはbashによって呼び出され、shの動作を模倣しようとします。 dash、cshなどのような他の実装があります。読みながらこの回答/bin/sh で呼び出すと、bash は起動ファイルを読み込み、POSIX モードに切り替えます。私はシェルの経験はあまりありませんが、この回答からわかるように、一部のシステムにはデフォルトでshがなく、bashまたは他のシェルがshに対して作業を行います。この問題について専門家の意見を聞きたいです。

  1. sh で呼び出すと、Bash は起動ファイルを読み込み、POSIX モードに入ります。しかし、このスタートアップファイルは何ですか?
  2. したがって、要点は、bashが私のシステムでshの操作を実行する場合、私のシステムにshがなく、shを持つすべてのスクリプトがbashまたはshが指す他のシェルによって呼び出されるということです。

答え1

sh で呼び出すと、Bash は起動ファイルを読み込み、POSIX モードに入ります。しかし、このスタートアップファイルは何ですか?

スタートアップファイルは起動するかどうかによって異なりますsh

  • 通常モードでは、対話型シェルとしてログインシェルの場合は最初のものです。 ///etc/profileログインシェルでない場合は、そうです。~/.bash_profile~/.bash_login~/.profile~/.bashrc

  • モードsh:ログインシェルの場合、/etc/profile対話型の場合は環境変数が指すもの。特に、モードではファイルを読みません。~/.profile$ENV~/.bash*sh

具体的な詳細はマニュアルを参照してください。これは些細なことではありません。6.2 Bash 起動ファイル

したがって、要点は、bashが私のシステムでshの操作を実行する場合、私のシステムにshがなく、shを持つすべてのスクリプトがbashまたはshが指す他のシェルによって呼び出されるということです。

問題が何であるか、Bashがsh操作を実行している間に他のシェルが何であるかわかりません。ただし、これに関係なく、Bashの別のコピーを/bin/sh指すと、hashbangを使用するすべてのスクリプトとCでライブラリ呼び出しで始まるコマンドはBashを使用して実行されます。しかし、Bashはこれらの用途と完全に互換性があるため、それは重要ではありません。/bin/bash#!/bin/shsystem()

また、csh他のファミリに属し、POSIX shと互換性がありません。

答え2

もともとUnixシステムには、sh特定の動作を実行する特定のプログラムがありました。 .cshksh

ただし、POSIXはPOSIXの動作を標準化し、最新のオープンソースオペレーティングshシステムではsh実際に異なる実装であることが多く、POSIXの動作を提供するモードしかありません。たとえば、FreeBSDではash; shOpenBSDでは同じプログラムであり、Linuxではしばしばshorを見つけることができます(Debianでは、、などを含む多くの他のものを許可しますが)。kshbashdashshzshmkshposh

この場合、システムにスタンドアロンプ​​ログラムがないため、呼び出されるシェルが必要なタスクをsh実行するのは事実です。 POSIXの動作を提供するモードにすぎません。shsh

このPOSIXモードでこの環境変数が存在しない場合、読み取った起動ファイルはログインシェルと/etc/profile対話$HOME/.profile型シェルが指すファイルの内容の合計です。$ENVシェル固有のファイルは呼び出されません。

関連情報