SHELL =“/ bin / bash”與SHELL =“bash”

SHELL =“/ bin / bash”與SHELL =“bash”

導出 SHELL="/bin/bash" 和 SHELL="bash" 有什麼不同?我以前export SHELL="bash"在我的 .bashrc 中有。這似乎有效。 $($SHELL) 產生了一個子 shell,但使用公鑰驗證的 ssh 給出了錯誤:Shell "bash" is not executable: No such file or directory

答案1

$($SHELL)產生一個子shell

是的,因為在外殼中$SHELL(或更好的 "$SHELL") 擴展為/bin/bashbash在您的情況下,擴展為雙重重擊。

附註:當您使用 時$($SHELL),來自新 shell 的輸出將在 shell 退出後執行,因為這就是命令取代 ( $( … )) 的工作原理。命令替換沒有什麼意義在這裡,不需要表明你的觀點。

你的觀點似乎是:當SHELL="bash","$SHELL"運行 Bash 時,但其他一些工具(SSH 伺服器?)抱怨。

目前尚不清楚哪個工具會抱怨。而且你沒有告訴我們是SHELL在客戶端還是在伺服器端被竄改。沒有麥克韋在問題中。還不清楚為什麼需要SHELL設定.bashrc.我不會調查這些。

我將告訴你和SHELL之間的區別/bin/bashbash 一般來說

環境變數的目的SHELL是指向您要使用的 shell。無論出於何種原因,各種軟體都可以使用該變數(如果設定)來嘗試執行您選擇的 shell。您觀察到的差異的發生是因為某些程序依賴於PATH環境變數,有些則不然。

依賴的PATH工作原理如下。有一個字串“編碼”要運行的可執行檔。例如,字串可能是/bin/bash,foo/bashbash。有兩種情況:

  1. 如果字串包含,/則字串本身被解釋為可執行檔的絕對路徑(例如/bin/bash)或相對路徑(例如)。foo/bash
  2. 如果字串不包含/(例如bash),則它僅指定可執行檔的基本名稱。路徑的其餘部分(即目錄組件)來自PATH.基本上,它是其中指定的第一個目錄,PATH其中包含具有指定基本名稱的可執行檔。根據PATH,bash可以解析為/bin/bash, /home/you/bin/bash, ./bash(很少)或根本不存在(給您command not found或類似的錯誤)。

Shell 依賴於PATH,因此在 shell bash(按字面輸入或從擴展$SHELL或其他方式出現)中查找/bin/bash/some/other/path/to/bash在配置合理的系統中。

不依賴的工具PATH將字串視為路徑(路徑名)。這對於包含 的字串沒有區別/。對於不包含 的字串來說,這會產生巨大的差異/。如果字串是bash並且它被直接解釋為路徑,則它相當於「在當前工作目錄中./bash命名的檔案」。bash

無論給您帶來錯誤的是什麼,顯然都會檢索變數的內容SHELL並將其用作路徑而不依賴該PATH變數。

這是正確的做法。注意 POSIX指定SHELL作為:

此變數應表示使用者首選命令語言解釋器的路徑名。

調查 ”路徑名“ 和 ”路徑名解析",這些不依賴PATH。任何使用該變數的工具SHELL都應將其內容直接視為路徑名。

當 時SHELL="bash",在 shell 中"$SHELL"運行 Bash 只是因為$SHELL展開像任何其他變數一樣然後bash被治療與任何其他不包含的命令一樣/。所以這有點偶然。

如果我正確解釋 POSIX 文檔,則SHELL="bash"僅當您的意思是SHELL="./bash".即使您是這個意思,最好使用帶有 的路徑/,因此 shell 中可以使用的機制PATH不會幹擾如何SHELL解釋。

很可能你不要./bash。你想要/bin/bash所以就用這個。

相關內容