Linux中神奇的叹号“!”命令——各类型用法总结

概述

整天在shell环境下操作,不积累点快捷输入的小技巧是不行的。

最常用的技巧恐怕就是Tab自动补全以及上方向键来回退上几条历史命令了,这些对于csh,bash,ksh,zsh都适用。

! 符号在 Linux 中不但可以用作否定符号,还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令。下面的所有命令都已经在 Bash Shell 中经过确切地检验。尽管我没有试过,但大多都不能在别的 Shell 中运行。这里我们介绍下 Linux 命令行中符号 ! 那惊人和奇妙的用法。

执行上一条命令

例如,在执行完上面一条命令后,可以使用下面的方式再次执行上一条命令:

$ whereis bash #执行命令

bash: /bin/bash /etc/bash.bashrc

$ !! #再次执行上一条命令

whereis bash

bash: /bin/bash /etc/bash.bashrc

!!代表了上一条执行的命令。可以看到,当输入两个感叹号时,它显示上条命令的同时会执行上一条命令。当然了,通常我们还会想到使用“UP”键来完成这个事情。但是如果是基于上条命令扩充,!!就来得更加方便了。

比如,你想查看某个文件,但是忘了输入more:

$ /opt/user/test.txt #忘记输入more

$ more !! #这样是不是快多了?

使用!!是不是方便多了?

使用上个命令第一个或最后一个的参数执行命令

使用上条命令最后一个参数

比如,你在使用ls列出目录内容时,没有带任何参数,但是想再次执行,带上-al参数,又不想输入长长的参数,可以使用下面的方式:

$ ls /etc/udev

/etc/udev

$ ls -al !$

ls -al /etc/udev

-r--r--r-- 1 root root 0 Jan 20 09:30 /etc/udev

这里的!$代表了上一条命令的最后一个参数。

使用上条命令第一个参数

而使用上条命令的第一个参数只需要使用!^,例如:

$ ls -al !^

去掉最后一个参数执行上一个命令

如果想执行上条命令,但不想带上最后一个参数:

$ ls -al dir #假设dir是一个很长的字符串

$ !:-

ls -al

什么场景下可能会用呢?比如你上一条命令最后一个参数是一个长长的字符串,而你恰好不想不用它,并且退格键删除又慢的时候,可以使用上面的方法。

使用上条命令的所有参数

前面说了使用上条命令的最后一个参数,那如果不是最后一个参数,该如何使用呢?很简单,使用!*即可。例如我们在输入find命令输错了,想要纠正的时候:

$ finsd -name "foo.zip" # 这里特意输错了find命令

$ find !*

find ./ -name "foo.zip"

./bar/foo.zip

./data/py/foo.zip

使用上条命令指定的参数

有的读者可能会问了,如果我只想用其中某个参数呢?按照![命令名]:[参数号]的规则即可。例如:

$ cp -rf dira dirb/ #将dira拷贝到dirb

$ ls -l !cp:2 #查看dira的内容

ls -l dira

total 0

-rw-rw-r-- 1 hyb hyb 0 Jan 20 16:18 barfile

当上条命令的参数很长,而你需要取用中间的某个参数时,效果就比较明显了。

执行上一条以关键字开头的命令

例如,执行上一条find命令:

$ !find #执行上条以find开头的命令

逻辑非的作用

这个是它最为人所熟悉的作用,例如删除除了cfg结尾以外的所有文件:

rm !(*.cfg)

小结

惊叹号的其他惊叹功能一览:

!!

上一条命令

!$

上一条命令中的最后一个参数

!:-

上一命令除了最后一个参数

!*

上一条命令中的所有参数

!str

最近一条以str开头的命令

!?str?

最近一条包含str的命令

!n

顺数第n条命令

!-n

倒数第n条命令

^old^new

将上一命令中的old替换为new

!!:gs/old/new

将上一命令中的old替换为new

!scp:gs/old/new

将上一scp命令中的old替换为new

干货分享

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190120B0YOAJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券