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