【问题标题】:POSIX function to search PATH for an executable?POSIX 函数在 PATH 中搜索可执行文件?
【发布时间】:2012-06-15 21:42:00
【问题描述】:

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

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

编辑: glibc's execvpe() function 有自己的 PATH 搜索,所以我猜该标准没有定义特定的 PATH 搜索功能。

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

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

【问题讨论】:

  • execvpexeclp 是 POSIX 标准函数。您是否正在寻找 搜索$PATH 的函数?
  • @larsmans:是的,并返回一个包含可执行文件完整路径的字符串(如果找到)

标签: c unix path posix


【解决方案1】:

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

没有。

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    and the source

    【讨论】:

    • 我不认为改编别人的数百行代码很简单。
    • 如果有一个简单的方法来做到这一点,它已经完成了。它不是 posix 规范的一部分。
    • 这很简单。遍历 $PATH 的元素是几行 C。如果有的话,它不在 POSIX 中的原因是它太简单,即自己做起来微不足道,因此不值得有人发明一个新的界面。
    • @R..:没两行代码那么简单;见证上述两种实现的规模和复杂性。一些必须处理的问题:PATH为空,PATH为空,PATH:开头,PATH:结尾,PATH包含::,报告用户友好的错误,处理特殊的文件系统行为等。
    • :开头或结尾不特殊;它是一个长度为零的路径组件,就像:: 一样,它必须被解释为.(不幸的是)。在获得下一个路径分量后,这些都被一个案例覆盖。两行代码会很难看,但我可以看到用不到 10 行代码就可以清楚地编写整个函数。
    【解决方案3】:

    做这样的事情怎么样:

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

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

    这种方法有一些缺点:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 2010-12-11
      • 2021-06-06
      • 2017-04-28
      • 2018-10-31
      • 2020-07-22
      • 1970-01-01
      相关资源
      最近更新 更多