【发布时间】:2021-02-12 14:57:44
【问题描述】:
我正在编写自己的一个非常简单的 shell 的实现,但我想支持通配符扩展。我在 stackoverflow 上阅读了一个答案,该答案建议在对命令进行标记时使用 glob(3) 进行单词扩展。
一个使用示例是下面的代码,它模拟打字
ls -l *.c ../*.c在外壳中:
glob_t globbuf; globbuf.gl_offs = 2; glob("*.c", GLOB_DOOFFS, NULL, &globbuf); glob("../*.c", GLOB_DOOFFS | GLOB_APPEND, NULL, &globbuf); globbuf.gl_pathv[0] = "ls"; globbuf.gl_pathv[1] = "-l"; execvp("ls", &globbuf.gl_pathv[0]);
知道如何使这个动态化并使用没有通配符的命令以及只有一个或多个通配符的命令吗?
glob(3) 是支持 shell 通配符扩展的最佳方式还是有更好的方式? 正则表达式会是更好的选择吗?我正在尝试在这里学习,如果我误解了某些内容,请原谅我,因为我是该领域的初学者。
这是我的标记器,以防万一:
int build_args(char * cmd, char ** argv) {
char *token;
token = strtok(cmd," ");
int i=0;
while(token!=NULL){
argv[i]=token;
token = strtok(NULL," ");
i++;
}
argv[i]=NULL;
return i;
}
【问题讨论】: