Shell

$PATH 環境變數中的百分比

  • June 25, 2014

我的 $PATH 看起來像這樣:

/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

在 bash 中,我可以毫無問題地呼叫位於

/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand

$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed"  -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template

但是,在 bourne shell 兼容模式下,找不到 wand:

$ wand
sh: 2: wand: not found

問題似乎是這些路徑中的 % 符號。此符號已通過 URL 編碼添加,因此即使它不是有效的文件名,也可以在目錄名稱中使用名稱“GNU/Linux”。是否可以讓名稱在 sh 中工作,或者使 sh 命令作為 bash 工作。也就是說,即使使用 /bin/sh 命令呼叫 bash,它的行為也相同,無論如何它都符號連結到 bash。

那不是 Bourne shell,也不是bash模擬 Bourne shell,而是 Almquist shell,在您的情況下可能是 Debian Almquist shell(Debian 的基於原始 Almquist shell 的 BSD 的 sh 本身的 Linux 分支)。

在 Almquist shell(原始版本和現代版本)中,%用於PATH特定於ash. 從文件中引用:

路徑搜尋

定位命令時,shell 首先查看它是否具有該名稱的 shell 函式。然後,如果 PATH 不包含 的條目 %builtin,它會查找該名稱的內置命令。最後,它依次在 PATH 中的每個條目中搜尋該命令。

PATH 變數的值應該是一系列用冒號分隔的條目。每個條目都包含一個目錄名稱,或一個目錄名稱後跟一個以百分號開頭的標誌。目前目錄應以空目錄名表示。如果不存在百分號,則該條目會導致 shell 在指定目錄中搜尋命令。如果標誌是%builtin ,則搜尋 shell 內置命令列表。如果標誌是, %func 則在目錄中搜尋一個文件,該文件被讀取為 shell 的輸入。該文件應定義一個函式,其名稱是正在搜尋的命令的名稱。

包含斜杠的命令名稱將被簡單地執行,而不執行任何上述搜尋。

其他 shell 喜歡kshzsh具有類似的函式自動載入機制,但它們使用不同的變數 ( $FPATH),但您無法定義哪個函式或執行檔優先。

在您的情況下,/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux被解釋為/home/torbjorr/deployed/vector/x86_64-GNU帶有2fLinux標誌的目錄。該標誌被忽略,因為它是未知的。

沒有辦法解決這個問題。即使 ash 具有逃逸機制,因此%不會對其進行特殊處理,但它在其他外殼或其他看起來$PATHexecvp().

您需要從 中刪除%字元$PATH,因此重命名您的目錄或添加符號連結。

或者不要ash用於您的/bin/sh. 其他不這樣做的輕量級 POSIX shell 實現包括yashmksh.

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