如何在 C 终端上获取任何命令的 exec 文件目录?

How to get directory of exec files of any commands on terminal in C?

我正在重写这个问题,因为据我所知,它还没有被清楚地理解。我在 C 中实现了自己的 shell,它需要支持原始命令执行的所有命令。

问题是 在 C 中执行所有现有的 UNIX bash 命令而不使用 使用 execvp()system() 已经让你轻松做到这一点的功能。

为此,我需要搜索可能包含任何类型的 UNIX 命令的所有必需目录。我只想知道:

当我检查我的 PATH 环境变量中的所有目录时,我是否真的确定我在任何发行版中都支持所有可能的 UNIX 命令? (在我的机器上变为 /bin//usr/bin//usr/local/bin

我还找到了一种方法,可以获取您插入的名为 realpath() 的文件的完整目录。但不幸的是,它 returns (null) 当我试图将命令的目录插入我自己的 shell.

你还有什么建议让我解决这个问题?作为最后的解决方案,从根目录递归搜索整个计算机以查找插入的命令是否有意义?

如果有什么不清楚的地方,请让我知道以澄清。如果您能用一段示例代码回答并清除问题中的 [on hold] 标签,如果您认为从现在开始已经清楚地描述了它,我将不胜感激。

提前致谢!

首先,请注意 realpath() 不搜索任何内容,它只是确定给定文件的绝对路径。

没有您想象的所有可能的 UNIX 命令。至少任何可执行文件都可以被认为是 UNIX 命令,可执行文件不一定是具有 x 权限的文件。 Shell 脚本可以通过 sh myscript 之类的命令执行,即使未授予可执行访问权限。只有二​​进制文件需要具有本机执行的附加权限。所以没有真正的标准可以帮助你。但是您可能拥有具有 x 权限但不是可执行文件的文件!

一个常见的用法是可执行文件位于某些目录 /bin/usr/bin/usr/local/bin 等类似目录中。您的 shell 有一个名为 PATH 的环境变量,其中包含目录列表,您可以在其中搜索您在命令行上自由指定的命令。

无论如何,如果你自己选择一个条件来进行详尽的搜索,说所有带有x的文件,那么你可以使用命令find like find some_starting_dir -perm +0111来获取所有文件x 就在某处。

如果您想对其进行编程,那么您可以使用旧版 readdir() 功能或更新的 nftw() 来进行您自己的目录遍历。即使在 SO 上,您也会找到很多这样的例子。

的确,UNIX 可执行文件绝对可以在任何地方,但在家庭作业的上下文中,搜索整个文件系统是没有意义的。您的讲师可能希望您使用 execv 自己实现 execvp 的功能。 execvp 所做的是,首先,它查看命令名称中是否有斜杠。如果存在,它会将命令和参数直接传递给 execv - 它不会搜索。否则,它会遍历 PATH 中的目录并检查该命令在每个目录中是否为可执行文件。至关重要的是,它不会扫描每个目录的内容;这不仅会非常慢,甚至在某些条件下(例如具有 --x 权限的目录)甚至无法工作,而是盲目地调用 execv 路径名“$dir/$cmd”。如果可行,execv 不会 return。如果它不起作用,并且 errno 设置为 ENOENT,它将继续尝试路径中的下一个目录。