為什麼 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 模式。我對 shell 沒有太多經驗,但正如這些答案所說:在某些系統中預設沒有 sh,而 bash 或任何其他 shell 正在為 sh 做功課。我想就此事發表一些專家意見。
- 當使用 sh 呼叫時,Bash 在讀取啟動文件後進入 POSIX 模式。但是這些啟動文件是什麼?
- 因此,關鍵是如果 bash 在我的系統中執行 sh 的工作,這是否意味著我的系統中沒有 sh 並且所有帶有 sh 的腳本都由 bash 或 sh 指向的任何其他 shell 呼叫。
在最初的 Unix 系統上,
sh
是具有特定行為的特定程序。它經常與後來出現的其他 shell 進行對比,例如csh
和ksh
。然而,POSIX 對 的行為進行了標準化
sh
,在現代開源作業系統上,通常sh
實際上是一些其他的實現,它只是提供了一種提供 POSIX 行為的模式。例如,在 FreeBSD 上,我們將其ash
稱為sh
; 在 OpenBSD 上,sh
andksh
是同一個程序,在 Linux 上,您經常會發現bash
ordash
assh
(儘管 Debian 允許許多其他程序,包括zsh
、mksh
、posh
和可能的其他程序)。在這種情況下,確實會呼叫任何 shell
sh
,sh
因為在這些系統上沒有獨立的sh
程序。它只是一種提供 POSIX 行為的模式。在該 POSIX 模式下,如果該環境變數不存在,則讀取的啟動文件是登錄 shell
/etc/profile
和互動式 shell$HOME/.profile
指向的文件的內容。$ENV
不呼叫特定於外殼的文件。
當使用 sh 呼叫時,Bash 在讀取啟動文件後進入 POSIX 模式。但是這些啟動文件是什麼?
啟動文件還取決於它是否啟動
sh
。
- 在普通模式下,作為一個互動式shell:
/etc/profile
和~/.bash_profile
//的~/.bash_login
第一個~/.profile
如果是登錄shell,~/.bashrc
如果不是登錄shell。- 在
sh
模式下:/etc/profile
如果~/.profile
是登錄外殼;以及環境變數$ENV
指向的是否是互動式的。特別是,它不會以模式讀取~/.bash*
文件。sh
有關實際詳細資訊,請參閱手冊,這並不簡單:6.2 Bash Startup Files
因此,關鍵是如果 bash 在我的系統中執行 sh 的工作,這是否意味著我的系統中沒有 sh 並且所有帶有 sh 的腳本都由 bash 或 sh 指向的任何其他 shell 呼叫。
我不確定問題是什麼,或者當 Bash 完成 sh 的工作時另一個 shell 會是什麼。但是無論如何,如果
/bin/sh
指向/bin/bash
(或者是 Bash 的另一個副本),那麼所有使用#!/bin/sh
hashbang 的腳本和system()
以 C 中的庫呼叫開頭的命令都將使用 Bash 執行。但這很好,因為 Bash 能夠很好地兼容這些用途。另請注意,它
csh
屬於不同的系列,並且與 POSIX sh 不兼容。