7. 历史命令扩展示例


使用history扩展,您可以从历史记录中选择特定命令,按原样执行它,或者根据您的需要修改并执行它。 从!开始历史扩展。

命令 描述
!! 重复上一个命令
!10 重复历史中的第 10 个命令
!-2 重复历史中倒数第 2 个命令
!string 重复历史记录中以 'string' 开头的命令
!?string 重复历史记录中包含 'string' 字符串的命令
^str1^str2^ 将上一条命令中的 str1 替换为 str2 并执行
!!:$ 获取上一个命令的最后一个参数
!string:n 获取历史记录中以 'string' 开头的命令的第 n 个参数

让我们假设您在某个时刻执行了以下命令,并且它位于历史记录中的某个位置。

$ /usr/local/apache2/bin/apachectl restart

稍后,当您想要执行相同的命令时,如果您尝试以下操作,它将失败,因为它正在寻找以 "apache" 开头的行。

$ !apache
-bash: !apache: event not found

但是,如果执行以下操作,它将查找包含字符串 "apache" 的任何命令并执行它,如下所示。

$ !?apache
/usr/local/apache2/bin/apachectl restart

有时您可能会使用快速ls命令检查文件是否存在,如下所示。

$ ls /etc/sysconfig/network

验证文件存在后,要使用vi查看文件的内容,无需再次键入整个文件名。 相反,请执行以下操作,这会将上一个命令中的单词 "ls" 替换为单词 "vi" 并执行该命令。

$ ^ls^vi
vi /etc/sysconfig/network

在此示例中,以下命令将/etc/passwd文件的副本作为passwd.bak复制到主目录。

$ cp /etc/passwd /home/ramesh/passwd.bak

创建文件的备份后,如果要打开备份文件,则无需再次键入整个备份文件名。 相反,您可以将上一个命令的最后一个参数与vi命令一起使用,如下所示。

$ vi !!:$
vi /home/ramesh/passwd.bak

请注意!:$!!:$完全相同。 所以,上面的例子也可以如下执行。

$ vi !:$
vi /home/ramesh/passwd.bak

当您执行具有多个参数的命令时(如下面的tar命令示例所示),您可以仅从中提取特定参数以供以后使用。

$ vi !:$
$ tar cvfz ~/sysconfig.tar.gz /etc/sysconfig/*

现在,如果您想ls新创建的tar.gz文件,您可以执行以下操作,这将采用上一个tar命令的第二个参数。

$ ls -l !tar:2
ls -l ~/sysconfig.tar