$ PATH中的Tilde char('〜')? (例如:PATH ='〜/ bin':/ usr / bin:/ bin)

时间:2017-06-22 16:20:13

标签: bash unix path posix

根据我的测试,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}})。

2 个答案:

答案 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,则路径搜索是实现定义的。

         

    由于冒号是此上下文中的分隔符,因此PATH中可能使用的目录名称不应包含冒号字符。

    < / LI>   

来自Glibc 2.22 doc:

25.4.2标准环境变量

  
      
  • PATH
      路径目录名序列,用于搜索文件。变量PATH包含用于搜索要运行的程序的路径。 execlp execvp 函数使用此环境变量,就像根据这些函数实现的许多shell和其他实用程序一样。路径的语法是由冒号分隔的目录名序列。空字符串而不是目录名称代表当前目录。
  •