在Linux上parsing$ PATH时,我们必须考虑什么样的情况?

我正在处理一个C程序,它必须走$ PATH才能find二进制文件的完整path名,唯一允许的依赖项是glibc(即不需要调用外部程序)。 在正常情况下,这只需要用冒号拆分getenv(“PATH”)并逐个检查每个目录,但是我想确保覆盖了所有可能的转angular情况。 我应该注意什么问题? 特别是,相对path,以〜开头的path将被扩展到$ HOME,或者包含:char允许的path?

有一件事让我感到惊讶,就是PATH中的空字符串表示当前目录。 两个相邻的冒号或PATH末尾的冒号表示当前目录是包含的。 这是记录在男人bash例如。

它也在POSIX规范中 。

所以

 PATH=:/bin PATH=/bin: PATH=/bin::/usr/bin 

所有的意思是当前的目录是PATH

我不确定这通常是Linux的问题,但是确保你的代码在PATH有一些时髦的(如UTF-8)编码来处理目录中的花哨字母。 我怀疑这可能取决于文件系统编码。

我记得有一个俄罗斯人用他的用户名(他的主目录名称出现在PATH )的bug报告。

这是微不足道的,但我会加上它,因为它还没有被提及。 $ PATH可以包括绝对路径和相对路径。 如果您通过chdir(2)搜索路径列表到每个目录中,则需要在每次爬网迭代时跟踪原始工作目录(getcwd(3))和chdir(2)。

现有的答案涵盖了大部分内容,但值得回答的部分问题尚未得到解答:

  1. $和〜在$ PATH的值中并不特殊。
  2. 如果没有设置$ PATH, execvp()将使用默认值。