为什么我的 PATH 被忽略了?
Why is my PATH ignored?
尽管我的 Unix PATH 包含 /Library/TeX/texbin
我的 PATH 的这个组件似乎被忽略了。例如,当我尝试
pdftex --version
我明白了
-bash: pdftex: command not found
同时
/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
这在评论中得到了解决,但我会 post 作为记录的答案:问题是由于 PATH
中的一个不可见字符,它被解释为实际目录名的一部分。具体来说,它最后是一个 space,但您可以从许多其他不可见字符中获得相同的效果。 (我实际上是在猜测 paths.d 中的一个文件是 DOS/Windows 文本格式,并且在该行的末尾有一个回车符 return。)
要使不可见的字符更明显,您可以使用printf
或cat -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
输出末尾的 \
-- 它实际上后面跟着一个 space,但你必须推断出这一点 -- 以及 space 在 cat -vet
输出中的 $
之前。顺便说一句,将对 $PATH
的引用放在双引号中非常重要,因为如果没有它们,space 就会被删除。
如果它是一辆马车 return,它会是这样的:
$ 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
将回车 return 显示为 \r
(并将整个内容包装在 $' ... '
中以指示应解释转义符),而cat -vet
显示为 ^M
.
尽管我的 Unix PATH 包含 /Library/TeX/texbin
我的 PATH 的这个组件似乎被忽略了。例如,当我尝试
pdftex --version
我明白了
-bash: pdftex: command not found
同时
/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
这在评论中得到了解决,但我会 post 作为记录的答案:问题是由于 PATH
中的一个不可见字符,它被解释为实际目录名的一部分。具体来说,它最后是一个 space,但您可以从许多其他不可见字符中获得相同的效果。 (我实际上是在猜测 paths.d 中的一个文件是 DOS/Windows 文本格式,并且在该行的末尾有一个回车符 return。)
要使不可见的字符更明显,您可以使用printf
或cat -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
输出末尾的 \
-- 它实际上后面跟着一个 space,但你必须推断出这一点 -- 以及 space 在 cat -vet
输出中的 $
之前。顺便说一句,将对 $PATH
的引用放在双引号中非常重要,因为如果没有它们,space 就会被删除。
如果它是一辆马车 return,它会是这样的:
$ 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
将回车 return 显示为 \r
(并将整个内容包装在 $' ... '
中以指示应解释转义符),而cat -vet
显示为 ^M
.