根据我的测试,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
({ {1}})。
答案 0 :(得分:2)
您在PATH
变量'~/bin'
此处引用了~
,但未进行扩展。这可以由bash
内置实用程序(如type
)处理,但which
是一个不扩展引用~
的外部程序。
如果您希望~
展开,请将其保留在引号之外:
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
答案 1 :(得分:0)
在POSIX.1-2008中找到以下信息:
XBD - 8.3其他环境变量
<强> PATH 强>
此变量应表示路径前缀的序列,某些函数和实用程序在搜索仅由文件名知道的可执行文件时适用。前缀应由冒号(:
)分隔。当对该文件名应用非零长度前缀时,如果前缀未以斜杠结尾,则应在前缀和文件名之间插入斜杠。零长度前缀是指示当前工作目录的传统功能。它显示为两个相邻的冒号字符(::
),作为列表其余部分之前的初始冒号,或者作为尾部冒号跟随列表的其余部分。严格符合要求的应用程序应使用实际路径名(例如.
)来表示PATH
中的当前工作目录。 应从头到尾搜索列表,将文件名应用于每个前缀,直到找到具有指定名称和适当执行权限的可执行文件。如果要搜索的路径名包含斜杠,不应执行通过路径前缀的搜索。如果路径名以斜杠开头,则解析指定的路径。如果未设置PATH
或将其设置为null,则路径搜索是实现定义的。由于冒号是此上下文中的分隔符,因此
< / LI>PATH
中可能使用的目录名称不应包含冒号字符。
来自Glibc 2.22 doc:
25.4.2标准环境变量
- 的 PATH 强>
路径是目录名序列,用于搜索文件。变量PATH
包含用于搜索要运行的程序的路径。execlp
和execvp
函数使用此环境变量,就像根据这些函数实现的许多shell和其他实用程序一样。路径的语法是由冒号分隔的目录名序列。空字符串而不是目录名称代表当前目录。