POSIX函数搜索PATH的可执行文件?

时间:2012-06-15 21:42:01

标签: c unix path posix

是否有POSIX函数根据POSIX spec's description of the PATH environment variablePATH中搜索可执行文件并返回可执行文件的绝对路径?

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

修改 glibc's execvpe() function执行自己的PATH搜索,因此我猜测标准没有定义特定的PATH搜索功能。

编辑2 我出于以下几个原因,我不想复制其他人的代码或实施PATH搜索:

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

3 个答案:

答案 0 :(得分:7)

  

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

没有

  

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

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

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

  

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

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

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

答案 1 :(得分:3)

命令行工具which会这样做。 here's the man page

and the source

答案 2 :(得分:0)

做类似的事情:

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

然后读取它的输出?这会导致行为与系统处理空/未设置PATH相匹配,并且可能比手动搜索PATH更简单。

这种方法有一些缺点:

  • 如果somecommand来自用户,则可能需要对其进行清理以防止代码注入攻击。这会增加复杂性。
  • 在处理所有可能的错误情况时可靠地读取流并非易事。更复杂。
  • 如果somecommand是内置的shell特殊内容(例如set),则会返回虚假结果。这种情况应该是可以检测的,但那么呢?更复杂。