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

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

我在 ubuntu 上使用zsh,并创建了一个符号链接,如下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 中,一切都按预期进行

答案1

如果您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"

它们之所以有效,是因为当它位于单词的开头、赋值语句中等号之后或赋值语句右侧的~之后时,它会扩展为主目录(这最后一条规则的目的正是为了方便设置)。:PATH

但是像这样的行PATH="~/.local/bin:$PATH"不起作用,因为它没有用双引号展开,所以最终~的值包含文字字符。这引用了当前目录中调用的目录,而不是您的主目录。PATH~PATH~

Bash1 有一个功能,~可以将其解释为路径条目开头的主目录。在 bash 中也PATH="~/.local/bin:$PATH"能部分工作。但是,它仅在您直接从 bash 运行程序时起作用,而在 bash 之外的程序本身启动程序时不起作用。因此,即使您使用 bash,也不要~在路径中放置文字,请确保它已扩展或使用$HOME


当不在 POSIX 模式下(例如运行 as 时)时sh,该功能会破坏 POSIX 合规性,因为 aPATH='~'旨在在~当前工作目录的文字子目录中查找命令。

相关内容