3.7 快速引用上一条命令的参数

很多时候,我们即将执行的命令与之前的命令具有相同的参数,比如同样的文件名、路径名等等。所以,我们在执行新的命令时无需重新输入这些同样的参数,只要直接从其引用过来即可。

3.7.1 引用最后一位参数

我最常用的是 !$,它允许我直接复用上一条命令的最后一位参数。当我用 mkdir 创建目录后,使用它来立即转到该目录:

xiaodong@codeland:~$ mkdir videos
xiaodong@codeland:~$ cd !$

这里,cd 命令后的 !$ 等同于上一条命令中的 videos

3.7.2 引用最开头的参数

与最后一位参数相反,!^ 能够让我们引用上一条命令中最开头的参数。这里的 ^$ 与正则表达式中的锚点类似。请看例子:

xiaodong@codeland:~$ ls /usr/share/doc /usr/share/man
xiaodong@codeland:~$ cd !^

在该例中,!^ 相当于上一条命令中的路径 /usr/share/doc

3.7.3 引用所有参数

不光是开头或结尾的参数,有时候我们想要引用的是上一条命令的所有参数。此时,我们可以使用 !*,这里的 * 意为全部。比如:

xiaodong@codeland:~$ ls src code
xiaodong@codeland:~$ cp -r !*

cp 命令中的 !*src code 同样,它表示两个参数都要引用。

3.7.4 引用第 n 个参数

对于引用上一条命令中的参数,我们甚至可以要求 Shell 精确到具体的第几个。因为 Shell 按照空白来解析命令行,所以它给命令本身编号为 0,后续的选项和参数按 1、2、3 等依次编号。如图 3.3 所示。这就好比程序中的数组一样。在下面的例子中,假如我们想要引用 bar.txt,除开 touch,按顺序它应该是第 2 个参数,因此可以像这样表示:

命令及选项参数编号

图 3.3: 命令及选项参数编号

xiaodong@codeland:~$ touch foo.txt bar.txt baz.txt
xiaodong@codeland:~$ nvim !:2

nvim 命令中的 !:2 就相当于上一条命令中的 bar.txt 文本文件。

3.7.5 引用从 m 到 n 的参数

还有一种情况可能会遇到,即同时引用上一条命令的好几个参数。此时,我们可以使用 !:m-n 表示法,m 为开始端,n 为结束端。我们继续以上例来说明:

xiaodong@codeland:~$ touch foo.txt bar.txt baz.txt
xiaodong@codeland:~$ nvim !:1-2

这里的 !:1-2 让我们引用 touch 命令中的前两个参数。

3.7.6 引用从 n 到最后的参数

我们最后再介绍一种情况,通过 !:n* 这种表示让我们能够从上一条命令中引用从第 n 个到最后的参数。例如:

xiaodong@codeland:~$ cat /etc/resolv.conf /etc/hosts /etc/hostname
xiaodong@codeland:~$ nvim !:2*

此处的 !:2* 允许我将 hostshostname 同时打开进行编辑。

值得提及的是,我们在此主要介绍的是如何引用上一条命令的参数,因为这是最为常见的使用场景。结合我们前面所讲的快速执行历史命令,我们也可以引用历史列表中其它命令的参数。比如:

xiaodong@codeland:~$ !hi:2

这将引用以 hi 打头的命令的第 2 个参数。

xiaodong@codeland:~$ !10:2-3

而这将引用第 10 条命令的 2、3 两个参数。