是否有POSIX函数根据POSIX spec's description of the PATH
environment variable在PATH
中搜索可执行文件并返回可执行文件的绝对路径?
如果没有,是否有一种简单,安全,标准且可靠的方式来搜索PATH
?
修改
glibc's execvpe()
function执行自己的PATH
搜索,因此我猜测标准没有定义特定的PATH
搜索功能。
编辑2 我出于以下几个原因,我不想复制其他人的代码或实施PATH
搜索:
PATH
未设置或设置为null,则路径搜索是实现定义的。”我希望这些情况下的行为与系统的行为一致,但如果没有我可以调用的标准函数,我就不能这样做。答案 0 :(得分:7)
是否有POSIX函数根据POSIX规范对PATH环境变量的描述在PATH中搜索可执行文件,并返回可执行文件的绝对路径?
没有
如果没有,是否有一种简单,安全,标准和可靠的方式来搜索PATH?
是和否。是的,PATH
的格式有一个标准,实现的正确性/可靠性遵循该标准。
不,没有标准功能可以做到这一点。复制代码是您最好的选择。
如果未设置
PATH
或将其设置为null,则路径搜索是实现定义的。
这意味着您无法始终移植复制execvp
所做的事情,但搜索/bin:/usr/bin
是一个非常安全的选择。或者,只是在这种情况下引发错误。
(我承认如果POSIX有这个功能会很好,但它不存在。)
答案 1 :(得分:3)
命令行工具which
会这样做。 here's the man page
答案 2 :(得分:0)
做类似的事情:
FILE *f = popen("command -v somecommand", "r")
然后读取它的输出?这会导致行为与系统处理空/未设置PATH
相匹配,并且可能比手动搜索PATH
更简单。
这种方法有一些缺点:
somecommand
来自用户,则可能需要对其进行清理以防止代码注入攻击。这会增加复杂性。somecommand
是内置的shell特殊内容(例如set
),则会返回虚假结果。这种情况应该是可以检测的,但那么呢?更复杂。