为什么我的PATH被忽略了?

时间:2016-03-06 17:06:53

标签: macos bash unix path osx-elcapitan

虽然我的Unix PATH包含/Library/TeX/texbin,但我的PATH的这个组件似乎被忽略了。例如,当我尝试

pdftex --version

我得到了

  

-bash:pdftex:找不到命令

/Library/TeX/texbin/pdftex --version

按预期工作。

同样,

其中-a pdftex

没有结果。

我的PATH由两个来源构建:/private/etc/paths,其中包含

/Users/Rax/.cabal/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Users/Rax/bin

以及/private/etc/paths.d/40-XQuartz/private/etc/paths.d/TeX中的两个附加文件,分别包含

/opt/X11/bin

/Library/TeX/texbin

这3个文件一起产生预期的PATH

$ echo $PATH
/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin

其他目录中的所有条目都按预期找到(包括/opt/X11/bin中的条目),但最后一个条目似乎被忽略(至少在查找可执行文件时)。

为什么我的PATH的一部分会被忽略?我如何确保它不是,以便按预期找到可执行文件?

OS X 10.11.3

1 个答案:

答案 0 :(得分:2)

这在评论中得到了解决,但我将作为记录的答案发布:问题是由PATH中的一个不可见字符引起的,该字符被解释为实际目录名称的一部分。具体来说,它最后是一个空格,但你可以从许多其他不可见的角色中获得相同的效果。 (我实际上猜测paths.d中的一个文件是DOS / Windows文本格式,并且在行尾有一个回车符。)

要使隐身字符更加醒目,您可以使用printfcat -vet

$ printf "%q\n" "$PATH"
/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin\ 
$ echo "$PATH" | LC_ALL=c cat -vet
/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin $

请注意\输出末尾的printf - 实际上后跟一个空格,但您必须推断 - 以及$之前的空格cat -vet输出。顺便说一下,将$PATH的引用放在双引号中是非常重要的,因为如果没有它们,空间就会被修剪掉。

如果它是一个回车代替,这就是它的样子:

$ printf "%q\n" "$PATH"
$'/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin\r'
$ echo "$PATH" | LC_ALL=c cat -vet
/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin^M$

在这种情况下,printf将回车显示为\r(并将整个内容包装在$' ... '中以指示应解释转义),而cat -vet显示它为^M