$PATH 環境變數中的百分比
我的 $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 喜歡
ksh
或zsh
具有類似的函式自動載入機制,但它們使用不同的變數 ($FPATH
),但您無法定義哪個函式或執行檔優先。在您的情況下,
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
被解釋為/home/torbjorr/deployed/vector/x86_64-GNU
帶有2fLinux
標誌的目錄。該標誌被忽略,因為它是未知的。沒有辦法解決這個問題。即使 ash 具有逃逸機制,因此
%
不會對其進行特殊處理,但它在其他外殼或其他看起來$PATH
像execvp()
.您需要從 中刪除
%
字元$PATH
,因此重命名您的目錄或添加符號連結。或者不要
ash
用於您的/bin/sh
. 其他不這樣做的輕量級 POSIX shell 實現包括yash
和mksh
.