我正在构建自己的外壳程序,我想知道:如何知道命令存储在目录“ / bin”及其子目录中。 我想实现一个char * path_to_command(char * commandname)函数,该函数返回参数中给定命令的路径。
我一直在寻找确定特定文件是否在目录中的函数(例如fopen或access)。但是这些功能只是告诉我们文件是否仅位于目录中。 我正在考虑使用fopen的递归函数,在该函数中我将不得不大量使用strcat。 我相信有更好的解决方案。
英语不是我的母语,如果有错误,我非常抱歉。 谢谢。
答案 0 :(得分:3)
不要自己编写递归函数,而是使用标准的nftw:
NAME
nftw-遍历文件树
简介
#include <ftw.h> int nftw(const char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags);
描述
nftw()函数应递归地下降目录层次结构 扎根于路径。
但是,对于标准外壳程序,无需递归搜索(最糟糕的是,这对于任何用户来说都是很奇怪的),您只需要搜索PATH
环境变量中提到的目录即可。
答案 1 :(得分:0)
您需要查看目录内容,并查看功能 opendir / readdir / closedir (#include <dirent.h>
)< / p>
{编辑添加}
请注意,当您扫描目录的内容时,您将到达目录“”。和“ ..”,请不要递归进入它们,因为“。”是当前目录,而“ ..”是上层目录(“ /”除外,其中“ ..”也是“ /”)
答案 2 :(得分:0)
您不仅可以使用opendir(3)和readdir(3)和closedir
,而且还可能想构造字符串中的某些文件路径(使用{ {1}}或asprintf)并在其上使用stat(2)或access(2)(因为snprintf
返回目录条目,您将其目录readdir
与路径结合使用)包含目录)。
您也可以使用nftw(3)。
但是,在外壳中,您只想迭代PATH
variable的组件,并将程序名称附加到每个组件上。为此,不需要递归下降。还有execvp(3)。