Bash

在 zsh 中找不到命令,但在 bash 中找到

  • May 20, 2021

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='~'旨在~在目前工作目錄的文字子目錄中查找命令。

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