$PATH 中的波浪字符('~')? (例如:PATH='~/bin':/usr/bin:/bin)

Tilde char ('~') in $PATH? (e.g.: PATH='~/bin':/usr/bin:/bin)

根据我的测试,bash$PATH 中的 ~ 非常满意,但 /usr/bin/which 则不然。 关于这个有什么标准(比如POSIX)吗?

示例:

[STEP 100] # echo $BASH_VERSION
4.4.12(1)-release
[STEP 101] # echo $PATH
/root/bin:/usr/sbin:/usr/bin:/sbin:/bin
[STEP 102] # /usr/bin/which passh
/root/bin/passh
[STEP 103] # type passh
passh is /root/bin/passh
[STEP 104] # 
[STEP 105] # PATH='~/bin':/usr/sbin:/usr/bin:/sbin:/bin
[STEP 106] # echo $PATH
~/bin:/usr/sbin:/usr/bin:/sbin:/bin
[STEP 107] # /usr/bin/which passh
[STEP 108] # hash -r
[STEP 109] # hash
hash: hash table empty
[STEP 110] # type passh
passh is /root/bin/passh
[STEP 111] #

我们可以看到,在步骤 107 which 中找不到 passh 但是在步骤 110 bash 中我清除哈希后仍然可以找到 passh table (hash -r).

您在 PATH 变量中有此部分:'~/bin'

这里 ~ 被引用并且没有被展开。这可以通过 bash 内置实用程序处理,例如 typewhich 是一个外部程序,不会扩展引用 ~.

如果您希望 ~ 展开,请将其放在引号之外,如:

PATH=~/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin

或使用$HOME:

PATH="$HOME/bin":/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin