【问题标题】:implementing globbing in a shell prototype在 shell 原型中实现 globbing
【发布时间】:2011-01-25 12:09:55
【问题描述】:

我正在为我的周末作业实现一个 linux shell,但我在将通配符匹配作为 shell 中的一项功能实现时遇到了一些问题。众所周知,shell 本身就是一门完整的语言,例如bash、ksh等。我不需要实现控制结构、作业等完整的功能。但是如何实现*

快速分析得出以下结果:

echo *

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

我也听说过 Perl Compatible Regular Expression ,但使用第三方库似乎很复杂。

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

【问题讨论】:

  • 那些不是正则表达式,而是通配符。例如。 * 不是一个有效的正则表达式,因为* 是一个限定符。这也称为globbing(一种模式匹配)。
  • “通配符”。西红柿,这就是我的意思,外卡。

标签: c bash shell


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这叫做通配符。它不是正则表达式的一种形式。
    【解决方案3】:

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

    请注意,shell 还执行字扩展(例如 "~""/home/user"),如果您手动进行文件名匹配,则应在全局扩展之前完成。 (或使用wordexp。)

    【讨论】:

    • 谢谢,但我想我会编写自己的通配符匹配函数。
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2016-10-10
    • 1970-01-01
    • 2019-09-21
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多