在 zsh 中找不到命令,但在 bash 中找到
我
zsh
在ubuntu上使用,我為此創建了一個符號連結bat
:
ln -s /usr/bin/batcat /home/user_name/.local/bin/bat
ls -l
從節目中擊中~/.local/bin
:
lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat
現在從任何目錄(甚至在
~/.local/bin
),如果我跑
bat
,我會得到command not found: bat
。執行~/.local/bin
也不行。但是,執行./bat
(from~/.local/bin
) 確實有效。跑步batcat
也可以。
echo $PATH
顯示~/.local/bin
在路徑中這裡可能出了什麼問題?沒有符號連結有效,
bat
只是一個例子PS在bash中,事情按預期工作
如果您
PATH
實際上包含~/.local/bin
文字波浪字元:那將不起作用。波浪號需要擴展到您的主目錄。例如,這些行中的任何一行在 zsh、bash 或任何其他類似 sh 的 shell 中都是正確的:
PATH=~/.local/bin:$PATH PATH=$PATH:~/.local/bin PATH=~/.local/bin:"$PATH" PATH="$PATH":~/.local/bin export PATH="$HOME/.local/bin:$PATH" export PATH="$PATH:$HOME/.local/bin"
它們之所以起作用,是因為
~
當它位於單詞的開頭、賦值中的等號之後或賦值:
右側的 a 之後(最後一條規則的目的正是為了設置方便PATH
)。但是像這樣的行是
PATH="~/.local/bin:$PATH"
行不通的,因為~
沒有用雙引號展開,所以 的值PATH
最終包含文字字元~
。這PATH
引用了~
在目前目錄中呼叫的目錄,而不是您的主目錄。Bash¹ 有一個特性,它
~
被解釋為路徑條目開頭的主目錄。PATH="~/.local/bin:$PATH"
在 bash 中部分工作也是如此。但是,它僅在您直接從 bash 執行程序時才有效,而不是當 bash 以外的程序本身啟動程序時。因此,即使您使用 bash,也不要~
在路徑中放置文字,確保它已擴展或$HOME
改為使用。當不處於 POSIX 模式時(例如執行 as 時)
sh
,因為該功能會破壞 POSIX 合規性,因為 aPATH='~'
旨在~
在目前工作目錄的文字子目錄中查找命令。