在shell中实现通配符扩展

时间:2011-02-08 00:11:46

标签: bash shell unix wildcard

我正在尝试创建自定义shell作为练习,并希望实现通配符扩展。像bash这样的shell究竟如何进行扩展?我的意思是涉及所有步骤?

据我所知,shell在当前目录中查找文件名,并将包含'*'的参数替换为应匹配的文件名。它是否正确?除了'*'

之外,shell应该执行哪些其他通配符扩展

4 个答案:

答案 0 :(得分:5)

POSIX规范描述了符合POSIX标准的shell应该支持的word expansions。您可以使用globwordexp POSIX函数执行这些扩展(glob仅支持wordexp支持的扩展的一小部分。

答案 1 :(得分:0)

Bourne shell [original sh]支持*?[range]扩展。 bash还支持**

答案 2 :(得分:0)

从技术上讲,通配符扩展与模式匹配概念密切相关。非常粗略,涉及的步骤包括:

  • 以某种可运行的regular expressionfinite state machine形式翻译包含通配符的表达式。
  • 如果我们正在使用FSM,将非确定性FSM转换为确定性FSM - 称为确定的过程。
  • 迭代所有可能的匹配候选人。
  • 通过使用预先构建的RE或FSM运行某种匹配算法,确定候选者是否与给定的通配符表达式匹配。
  • 在列表中收集通过的候选人,用收集的列表替换通配符表达式。

对于各种各样的字符,请查看特定shell实现的文档(例如,bashzsh等)。大多数这些东西直接映射到正则表达式机制的一个或几个特征。

答案 3 :(得分:0)

您可以在标记给提示的命令时对通配符进行扩展。使用glob(3)库执行通配符扩展。通过在全局函数中设置不同的标志,可以执行各种类型的扩展。 glob(3) documentation

有关不同类型的通配符扩展的参考-Here