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に対して作業を行います。この問題について専門家の意見を聞きたいです。
- sh で呼び出すと、Bash は起動ファイルを読み込み、POSIX モードに入ります。しかし、このスタートアップファイルは何ですか?
- したがって、要点は、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/sh
system()
また、csh
他のファミリに属し、POSIX shと互換性がありません。
答え2
もともとUnixシステムには、sh
特定の動作を実行する特定のプログラムがありました。 .csh
ksh
ただし、POSIXはPOSIXの動作を標準化し、最新のオープンソースオペレーティングsh
システムではsh
実際に異なる実装であることが多く、POSIXの動作を提供するモードしかありません。たとえば、FreeBSDではash
; sh
OpenBSDでは同じプログラムであり、Linuxではしばしばsh
orを見つけることができます(Debianでは、、などを含む多くの他のものを許可しますが)。ksh
bash
dash
sh
zsh
mksh
posh
この場合、システムにスタンドアロンプログラムがないため、呼び出されるシェルが必要なタスクをsh
実行するのは事実です。 POSIXの動作を提供するモードにすぎません。sh
sh
このPOSIXモードでこの環境変数が存在しない場合、読み取った起動ファイルはログインシェルと/etc/profile
対話$HOME/.profile
型シェルが指すファイルの内容の合計です。$ENV
シェル固有のファイルは呼び出されません。