如何在 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
,它将继续尝试路径中的下一个目录。
我正在重写这个问题,因为据我所知,它还没有被清楚地理解。我在 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
,它将继续尝试路径中的下一个目录。