你每天在终端里敲几百行命令,却可能从没用过Bash最省时间的功能。不是新工具,不是插件,是1990年就存在的「历史扩展」——大多数人只用过!!这一个快捷键。

这篇内容来自一位长期泡在命令行的开发者整理。他把Bash历史扩展拆成了三个可组合的部分,能帮你减少重复输入、快速修正命令、甚至直接提取之前用过的参数。

打开网易新闻 查看精彩图片

下面按「谁需要→怎么用→能省什么事」的逻辑,完整拆解这7个技巧。

先理解Bash历史扩展的三段结构

Bash的历史扩展不是单一命令,而是一个可拼接的语法系统。完整格式长这样:

event-designator[:word-designator[:modifiers]]

三段各司其职:

• 事件指示符(event designator):选哪条历史命令
• 词语指示符(word designator):选这条命令里的哪个参数
• 修饰符(modifier):对选中的内容做什么处理

举个例子:!!:2:p 表示「上一条命令(!!)的第2个参数(:2),打印出来看看(:p)」。

第一段「!!」是最常见的,重新执行上一条命令。但很多人不知道后面还能接东西——这就是效率差距的来源。

技巧1-3:事件指示符的进阶选法

事件指示符决定「选哪条命令」。除了!!,还有几种更精准的用法:

!n:执行历史记录第n条命令。用history命令看编号,然后直接调用。

!-n:执行倒数第n条命令。!-1等同于!!!-2是上上条命令。

!string:执行最近一条以「string」开头的命令。比如!git直接跑上一条git命令,不用翻历史。

这些在重复执行长命令时特别有用。比如一条带十几个参数的数据库导出命令,用!dump比按上箭头找快得多。

技巧4-5:词语指示符提取参数

有时候你只需要上条命令的某个参数,不是整条命令。词语指示符就是干这个的。

语法是在事件指示符后加冒号和数字:!!:n表示上条命令的第n个参数。注意从0开始计数——0是命令本身,1是第一个参数。

常用简写:!$等于!!:$,表示上条命令的最后一个参数。这在文件操作里极其实用:

mkdir very/long/path/name
cd !$

直接进刚创建的目录,不用重新打路径。

另一个:!*等于!!:*,表示上条命令的所有参数(不含命令本身)。适合命令写错但参数要复用的情况:

cp file1 file2 /wrong/path
mv !* /correct/path

技巧6:修饰符做字符串处理

选中内容后,可以用修饰符做简单处理。原文提到了几个:

:p:打印但不执行。用来确认自己拼对了历史扩展,避免误操作。

:h:取目录部分(head)。!!:1:h拿到上条命令第一个参数的所在目录。

:t:取文件名部分(tail)。!!:1:t拿到纯文件名,去掉路径。

:r:去掉扩展名。!!:1:rfile.txt变成file

:e:只留扩展名。

这些可以链式组合。!!:2:p:h就是「上条命令第2个参数,打印出来,再取目录部分」。

技巧7:快速替换——^old^new

这是唯一不以「!」开头的历史扩展。格式是^old^new,把上条命令里的「old」替换成「new」再执行。

典型场景:命令打错了一个单词,或者需要改个端口号、文件名。比按上箭头回去改快得多。

注意:只替换第一个匹配项。如果需要全局替换,要用!!:gs/old/new/这种完整语法。

为什么这些技巧现在才被人系统整理

Bash的历史扩展机制从1990年就存在,但官方文档的写法偏技术规范,不是「用户手册」风格。大多数开发者通过口口相传学几个快捷键,没意识到这是个可组合的系统。

原文作者的做法是:把三个段落(事件、词语、修饰符)拆开,用「选什么→选哪部分→怎么处理」的逻辑重新组织。这让零散的技巧变成了可推理的工具集——你知道了结构,就能自己组合出新用法。

这对工具类内容的启示很明显:成熟技术的隐藏功能,往往缺的不是实现,而是「把设计逻辑翻译成用户语言」的二次整理。

实际能省多少时间

单看一个技巧,可能只省几秒钟。但命令行操作的特点是高频、重复、打断思路。每次翻历史、重新打路径、改命令里的参数,都是认知负担。

原文作者没有给具体数字,但从使用场景可以估算:如果你每天要在终端执行50条以上命令,其中20%需要基于上条命令做调整,这些技巧每周能省下的时间以小时计。更重要的是减少上下文切换——不用盯着历史记录找,不用光标来回移动,肌肉记忆形成后几乎是条件反射。

怎么开始用

不需要一次性记住所有语法。建议从两个最高频的开始:

1. !$:进刚创建的目录、操作刚生成的文件
2. ^old^new:快速修正打错的命令

熟练后再逐步加入!:n提取特定参数、:h/:t处理路径。遇到不确定的先用:p预览,确认安全再执行。

这些技巧的另一个价值是跨平台——Bash是Linux和macOS的默认shell,Windows的WSL也支持。学会一次,到处可用。

最后检查你的Bash版本:历史扩展默认开启,但某些环境可能关闭了。如果!!没反应,检查set +H是否被误执行过,用set -H重新开启。