在shell原型中实现globbing

时间:2011-01-25 12:09:55

标签: c bash shell

我正在为我的周末任务实现一个linux shell,我在实现wilcard匹配作为shell中的一个功能时遇到了一些问题。众所周知,炮弹本身就是一种完整的语言,例如: bash,ksh等我不需要实现控制结构,工作等完整功能。但是如何实现*

快速分析会给您以下结果:

echo *

列出当前目录中的所有文件。这是shell的唯一逻辑表现吗?我的意思是,不考虑bash的语言特性,这是shell在内部做的吗?将*替换为当前目录中与模式匹配的所有文件?

我也听说过Perl兼容正则表达式,但使用第三方库似乎很复杂。

任何建议,链接等?对于bash,我也会尝试查看源代码。

3 个答案:

答案 0 :(得分:3)

这称为“globbing”,执行此操作的函数名称相同:glob(3)

答案 1 :(得分:2)

是的,这就是shell的作用。它将替换'*'中所有文件和文件夹名称的cwd个字符。事实上,它是非常基本的正则表达式,仅支持'?''*',并与cwd中的文件和文件夹名称匹配。 请注意,在简单或双引号\*'*'之间插入的反斜杠'"不会被替换(反斜杠和引号会在传递给执行的命令之前被删除)。

答案 2 :(得分:1)

如果你想要比glob给出更多的控制,标准函数fnmatch只执行全局匹配。

请注意,如果您手动进行文件名匹配,shell也会执行单词扩展(例如"~""/home/user"),这应该在glob扩展之前完成。 (或使用wordexp。)