-2

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

问题是在 C 中执行所有现有的 UNIX bash 命令, 而不使用已经让您轻松执行此操作的函数execvp()system()

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

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

我还找到了一种方法,它可以获取您插入的文件的完整目录,称为realpath()。但不幸的是,(null)当我尝试获取插入到我自己的 shell 中的命令目录时,它会返回。

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

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

提前致谢!

4

2 回答 2

3

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

于 2017-12-02T14:37:44.233 回答
1

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

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

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

无论如何,如果您选择一个标准来自己进行详尽的搜索,比如说所有文件都x正确,那么您可以使用命令findlikefind some_starting_dir -perm +0111来获取所有在x某处正确的文件。

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

于 2017-12-02T13:30:19.243 回答