Linux

為什麼 sh 有一個指向 dash 或 bash 的符號連結?

  • May 23, 2021

我發現 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 做功課。我想就此事發表一些專家意見。

  1. 當使用 sh 呼叫時,Bash 在讀取啟動文件後進入 POSIX 模式。但是這些啟動文件是什麼?
  2. 因此,關鍵是如果 bash 在我的系統中執行 sh 的工作,這是否意味著我的系統中沒有 sh 並且所有帶有 sh 的腳本都由 bash 或 sh 指向的任何其他 shell 呼叫。

在最初的 Unix 系統上,sh是具有特定行為的特定程序。它經常與後來出現的其他 shell 進行對比,例如cshksh

然而,POSIX 對 的行為進行了標準化sh,在現代開源作業系統上,通常sh實際上是一些其他的實現,它只是提供了一種提供 POSIX 行為的模式。例如,在 FreeBSD 上,我們將其ash稱為sh; 在 OpenBSD 上,shandksh是同一個程序,在 Linux 上,您經常會發現bashor dashas sh(儘管 Debian 允許許多其他程序,包括zshmkshposh和可能的其他程序)。

在這種情況下,確實會呼叫任何 shell shsh因為在這些系統上沒有獨立的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/shhashbang 的腳本和system()以 C 中的庫呼叫開頭的命令都將使用 Bash 執行。但這很好,因為 Bash 能夠很好地兼容這些用途。

另請注意,它csh屬於不同的系列,並且與 POSIX sh 不兼容。

引用自:https://unix.stackexchange.com/questions/650936