Shell 里的感叹号:不是“大喊大叫”,而是高效偷懒神器!

📅 2026/8/13 1:15:25
Shell 里的感叹号:不是“大喊大叫”,而是高效偷懒神器!
导航链接[主页] [文章] [项目] [关于] [聘请]文章主题与信息shell 里的感叹号不是用来“大喊大叫”的要学会偷懒。自 20 世纪 70 年代末以来事件指示符就一直存在它功能强大。发布时间为 2026 年 8 月 5 日 20:12 UTC修改时间为 2026 年 8 月 8 日 17:34 UTC作者是 Filip Roséen标签包含 #shell、#bash、#zsh、#posix、#unix。目录别冲同事发火在 shell 里“发泄”吧大家都能接受的命令行重复操作避免重复劳动什么是神奇的事件指示符包括事件指示符、单词指示符、修饰符POSIX 与 fc 命令的强大功能合理使用感叹号包括三个常用规则、四个实用技巧、我还不太会用感叹号有什么建议吗接下来该怎么做常见问题解答包括为什么不用 ctrl - r而非要记一堆东西呢、为什么不用 alt - . 代替 !$ 呢、你是不是忽略了其他有用的功能、! 老是碍事怎么关掉它拓展阅读别冲同事发火在 shell 里“发泄”吧人与人选择的编辑器和喜欢的编程语言可能不同但大家或许都有点懒。本文主要针对 bash、csh、tcsh 和 zsh 这些 shell不用这些 shell 的也可看看“POSIX 与 fc 命令的强大功能”部分。大家都能接受的命令行重复操作人们常有在 shell 历史记录里按上箭头重复命令的经历若能直接引用之前的命令及其参数会更好。这里展示了使用感叹号实现命令行重复操作的示例且这些技巧主要适用于交互式 shell除非另行配置否则不要在新的 amazing.sh 脚本里使用。避免重复劳动人们常听到“不要重复自己”但在命令行上却很少遵循“避免重复劳动”原则。文中给出多个使用感叹号避免重复输入的示例如用 sudo !! 重复执行命令、cd !$ 切换到指定目录等。什么是神奇的事件指示符乍一看事件指示符可能让人望而生畏但其模式很简单。想了解基本用法可看“合理使用感叹号”部分熟练者可直接看“POSIX 与 fc 命令的强大功能”部分。事件指示符紧跟在感叹号后面的部分表示要引用的命令行文中给出多个重新执行所引用命令的示例如 !! 表示上一条命令等。若 ! 后面紧接着 :则表示没有明确指定事件表达式将引用上一条命令。单词指示符在事件指示符后面可指定要引用命令行的哪一部分。文中给出基于特定命令的单词指示符使用示例且有几个简写表达式不用写冒号也能生效。修饰符修饰符能让你只提取或修改原本整个参数的特定部分文中给出多个修饰符使用示例如 !:$:h 去掉文件名等。POSIX 与 fc 命令的强大功能不管 shell 支不支持 !fc 都应是必备工具它可用来重复上一条命令还能在喜欢的编辑器里编辑命令行。文中给出多个 fc 命令使用示例且 fc 会调用 $FCEDIT 指定的程序进行编辑也可用 -e 指定要调用的编辑器。fc 是 POSIX 用户可移植性实用程序的一部分像 dash 和 busybox ash 这类极简 shell 完全没有这个命令。合理使用感叹号事件指示符或 fc 命令虽不会让人生活巨变但能节省按键操作。三个常用规则!! 展开为上一条命令!needle 展开为最近一条以 needle 开头的命令!?needle? 匹配最近一条包含 needle 的命令。四个实用技巧!$ 是上一条命令的最后一个参数!:0 用于重新运行某个位置比较麻烦的脚本!$:h 可轻松提取目录部分!$:t 只获取文件名。我还不太会用感叹号有什么建议吗在 _bash_ 里可用 shopt - s histverify在 _zsh_ 里可用 setopt HIST_VERIFY启用后按下回车键时命令会先展开显示出来而不是直接执行。也可用 :p 修饰符来打印要执行的命令但不实际执行展开的命令会记录在历史记录里等准备好后直接用 !! 就可以执行。接下来该怎么做现在只能多练习别冲同事发火记住在 shell 里感叹号不是用来“大喊大叫”的。常见问题解答若有问题或反馈可发邮件。为什么不用 ctrl - r而非要记一堆东西呢ctrl - r 功能强大但最多只能给一个模板让修改而事件指示符能让提取部分内容。若已知道要运行什么命令使用事件指示符更方便。为什么不用 alt - . 代替 !$ 呢alt - . 可遍历 shell 历史记录里的“最后一个参数”但功能比较单一。你是不是忽略了其他有用的功能写文章不是搞“二选一”能完成工作的方法就是好方法个人偏好和工作流程比文章更重要。! 老是碍事怎么关掉它很多人被事件指示符的“易用性”坑过却不知其用途在 _bash_ 里可用 set H在 _zsh_ 里可用 setopt nobanghist 禁用该功能其他 shell 建议查看手册。也可用喜欢的字符来代替记得把配置写到相应的 .rc 文件里使修改一直生效。拓展阅读本系列的其他文章及与事件指示符相关的文档介绍。