9

是否有 POSIX 函数PATH根据POSIX 规范对PATH环境变量的描述搜索可执行文件并返回可执行文件的绝对路径?

如果没有,是否有一种简单、安全、标准、可靠的搜索方式PATH

编辑: glibc 的execvpe()函数进行自己的PATH搜索,所以我猜PATH该标准没有定义特定的搜索函数。

编辑 2:出于以下几个原因 ,我不想复制别人的代码或PATH自己实现搜索:

  • 干燥
  • 我必须测试和维护更多代码
  • 可能的许可问题
  • POSIX 说,“如果PATH未设置或设置为 null,则路径搜索是实现定义的。” 我希望这些情况下的行为与系统所做的一切保持一致,但如果没有我可以调用的标准函数,我就不能这样做。
4

3 回答 3

8

是否有一个 POSIX 函数根据 POSIX 规范对 PATH 环境变量的描述在 PATH 中搜索可执行文件并返回可执行文件的绝对路径?

不。

如果没有,是否有一种简单、安全、标准、可靠的方式来搜索 PATH?

是和不是。是的,有一个格式的标准,PATH实现的正确性/可靠性遵循该标准。

不,没有标准功能可以做到这一点。复制代码是你最好的选择。

如果PATH未设置或设置为 null,则路径搜索是实现定义的。

这意味着您不能总是可移植地复制所做的事情execvp,但搜索/bin:/usr/bin是一个非常安全的选择。或者,在这种情况下只引发错误。

(我承认如果 POSIX 有这个功能会很好,但它就是不存在。)

于 2012-06-16T11:47:28.517 回答
3

命令行工具which将执行此操作。这是手册页

和来源

于 2012-06-15T21:53:09.383 回答
-1

怎么样做类似的事情:

FILE *f = popen("command -v somecommand", "r")

然后读取它的输出?这将导致与系统对 empty/unset 的处理相匹配的行为PATH,并且可能比手动搜索更简单PATH

这种方法有一些缺点:

  • 如果somecommand来自用户,则可能必须对其进行清理以防止代码注入攻击。这会增加复杂性。
  • 在处理所有可能的错误情况时可靠地读取流并非易事。更复杂。
  • 如果somecommand是一个特殊的shell 内置(例如,set),它会返回虚假的结果。这种情况应该是可以检测到的,但是然后呢?更复杂。
于 2012-06-17T05:02:38.557 回答