![SHELL =“/ bin / bash”與SHELL =“bash”](https://rvso.com/image/1648608/SHELL%20%3D%E2%80%9C%2F%20bin%20%2F%20bash%E2%80%9D%E8%88%87SHELL%20%3D%E2%80%9Cbash%E2%80%9D.png)
導出 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/bash
或bash
在您的情況下,擴展為雙重重擊。
附註:當您使用 時$($SHELL)
,來自新 shell 的輸出將在 shell 退出後執行,因為這就是命令取代 ( $( … )
) 的工作原理。命令替換沒有什麼意義在這裡,不需要表明你的觀點。
你的觀點似乎是:當SHELL="bash"
,"$SHELL"
運行 Bash 時,但其他一些工具(SSH 伺服器?)抱怨。
目前尚不清楚哪個工具會抱怨。而且你沒有告訴我們是SHELL
在客戶端還是在伺服器端被竄改。沒有麥克韋在問題中。還不清楚為什麼需要SHELL
設定.bashrc
.我不會調查這些。
我將告訴你和SHELL
之間的區別/bin/bash
bash
一般來說。
環境變數的目的SHELL
是指向您要使用的 shell。無論出於何種原因,各種軟體都可以使用該變數(如果設定)來嘗試執行您選擇的 shell。您觀察到的差異的發生是因為某些程序依賴於PATH
環境變數,有些則不然。
依賴的PATH
工作原理如下。有一個字串“編碼”要運行的可執行檔。例如,字串可能是/bin/bash
,foo/bash
或bash
。有兩種情況:
- 如果字串包含,
/
則字串本身被解釋為可執行檔的絕對路徑(例如/bin/bash
)或相對路徑(例如)。foo/bash
- 如果字串不包含
/
(例如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
所以就用這個。