借通配符展开问题描述 shell 的整个执行流程
发布日期:2021-05-10 10:32:52 浏览次数:23 分类:精选文章

本文共 1314 字,大约阅读时间需要 4 分钟。

Shell脚本中的通配符展开与执行流程

在shell脚本编写中,通配符展开是一个非常实用的功能,尽管其描述能力不如正则表达式强大,但在日常使用中依然提供了极大的便利。然而,许多人对shell的运行流程不够了解,导致在实际使用中出现了一些问题。本文将深入探讨shell脚本中的通配符展开过程及其相关问题。

Shell执行流程的核心理解

在使用shell脚本时,最常用的shell是bash。要了解bash的执行流程,可以通过man bash查看 EXPANSION(展开)部分的详细说明。根据bash的官方资料,展开流程共包含七种类型,具体顺序如下:

  • brace expansion(花括号展开)
  • tilde expansion(波浪号展开)
  • parameter and variable expansion(参数和变量展开)
  • arithmetic expansion(算术表达式展开)
  • command substitution(命令替换)
  • word splitting(字段切割)
  • pathname expansion(路径名展开)
  • 通配符展开实际上是在第七阶段即路径名展开阶段完成的。这意味着通配符的作用对象是路径名,而不是命令参数或其他部分。这一认识对于正确使用通配符非常关键。

    shell执行流程的实践考量

    在实际编写shell脚本时,单引号和双引号对展开流程的影响尤为重要。具体来说:

    • 单引号括起来的token:在单引号中,所有的展开步骤都会被跳过,包括通配符展开。因此,单引号中的通配符不会被展开。

    • 双引号括起来的token:双引号中的展开步骤会受到限制,只有算术表达式展开会被执行,其他展开步骤(如通配符展开)会被跳过。

    例如:

    # 单引号中的通配符不会展开
    $ 'ls ~' # 输出: ls ~,因为没有展开波浪号
    $ "ls ~" # 输出: ls ~,因为双引号中没有执行通配符展开

    一个典型问题的剖析

    在实际工作中,我曾遇到过一个类似的问题:使用通配符展开拷贝库文件失败。具体命令如下:

    cp -rf "${NEW_DIR}/lib/*" lib64/dpdk_lib/

    问题分析

    在这个命令中,通配符*位于双引号内。根据shell的处理规则,双引号中的通配符不会被展开。因此,命令实际执行的是cp -rf "${NEW_DIR}/lib/*" lib64/dpdk_lib/,其中*被视为一个字面字符,导致shell无法找到匹配的文件,最终报错。

    解决方案

    正确的命令应移除双引号:

    cp -rf ${NEW_DIR}/lib/* lib64/dpdk_lib/

    此时,通配符*会被正确展开为匹配的文件列表,从而完成拷贝任务。

    总结

    在编写shell脚本时,正确理解通配符的展开规则至关重要。特别是在引号处理上,单引号和双引号对展开流程的影响需要特别注意。通过上述分析,可以避免因通配符未被展开而导致的工作失败。

    在技术学习中,深入理解每一个细节虽然短期内看不到直接效果,但长远来看却能为我们带来巨大的收获。无论是从书籍、资料还是实践中获取知识,都需要系统化和结构化的学习方式,以构建完整的技术知识体系。

    上一篇:用 metapost 画 tcp/ip 详解卷 2 里面的图
    下一篇:网卡 promiscuous mode 与 MAC 的一些 filter 功能

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月15日 03时36分30秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章