Linux下感叹号!的特殊用法

Posted by AspenStars on May 21, 2020

感叹号!

!符号在 Linux 中不但可以用作否定符号,还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令。

主要作用是命令参数过长,或者命令使用很久后还需要使用命令或其中的参数的情况。避免重复输入过长的参数

总览

命令 作用
!! 执行上一条命令
!$ 使用上一条命令中的最后一个参数
!:- 使用上一条命令除最后一个参数外的所有参数
!* 使用上一条命令中的所有参数
!str 执行最近一条以str开头的命令
!?str? 执行最近一条包含str的命令
!n 执行顺数第n条命令
!-n 执行倒数第n条命令
^old^new 将上一命令中的第一个old替换为new后重新执行
!!:gs/old/new 将上一命令中的所有old替换为new后重新执行
!scp:gs/old/new 将上一特定命令(如scp)中的所有old替换为new后重新执行

直接重复执行上一条指令

与up键的效果一致

1
!!

例如

1
2
3
4
5
6
7
# 上一命令
ls a b c

# 使用感叹号
ls !!
# 等价于
ls a b c

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

执行新的命令,但使用上一命令的参数,适用于上一命令最后一个参数较长的情况

1
!$

例如

1
2
3
4
5
6
7
# 上一命令
ls a b c

# 使用感叹号
ls !$
# 等价于
ls c

使用上一条命令除最后一个参数外的所有参数

1
!:-

例如

1
2
3
4
5
6
7
# 上一命令
ls a b c

# 使用感叹号
ls !:-
# 等价于
ls a b

使用上一条命令中的所有参数

1
!*

例如

1
2
3
4
5
6
7
# 上一命令
ls a b c

# 使用感叹号
ls !*
# 等价于
ls a b c

!!的区别是,这个可以在保留参数的情况下更换命令

执行最近一条以str开头的命令

1
!str

例如

1
2
3
4
5
6
7
8
9
# 上几条命令
ls a b c
find ./ -name 'foo.zip'
cd a

# 使用感叹号
!find
# 等价于
find ./ -name 'foo.zip'

执行最近一条包含str的命令

1
!?str?

例如

1
2
3
4
5
6
7
8
9
# 上几条命令
ls a b c
find ./ -name 'foo.zip'
cd a

# 使用感叹号
!fi
# 等价于
find ./ -name 'foo.zip'

执行顺数第n条命令

这个命令要与history命令一起执行,用history打印出最近执行的命令,然后根据命令前的编号选择执行

1
!n

例如

1
2
3
4
5
6
7
8
9
10
11
# 用history命令得到
...
5 ls a b c
6 find ./ -name 'foo.zip'
7 cd a
...

# 使用感叹号
!6
# 等价于
find ./ -name 'foo.zip'

执行倒数第n条命令

这个命令要与history命令一起执行,用history打印出最近执行的命令,然后根据命令前的编号选择执行,history的最后一条命令为-1

1
!-n

例如

1
2
3
4
5
6
7
8
9
10
11
# 用history命令得到
...
5 ls a b c
6 find ./ -name 'foo.zip'
7 cd a
这里是结尾了

# 使用感叹号
!-2
# 等价于
find ./ -name 'foo.zip'

将上一命令中的第一个old替换为new后重新执行

这里直接用^这个符号即可,不用感叹号了,会自动去匹配上一条命令

1
^old^new

例如

1
2
3
4
5
6
7
# 上一命令
ls a b c

# 使用符号
^a^d
# 等价于
ls d b c

将上一命令中的所有old替换为new后重新执行

1
!!:gs/old/new

例如

1
2
3
4
5
6
7
# 上一命令
ls a b c a

# 使用感叹号
!!:gs/a/d
# 等价于
ls d b c d

将上一特定命令中的所有old替换为new后重新执行

1
2
3
!find:gs/old/new
或者
!ls:gs/old/new

例如

1
2
3
4
5
6
7
8
9
# 上几条命令
ls a b c a
find ./ -name 'foo.zip'
cd a

# 使用感叹号
!ls:gs/a/d
# 等价于
ls d b c d

逻辑非

本身自带的逻辑非功能,与感叹号功能无关

删除除了cfg结尾以外的所有文件:

1
rm !(*.cfg)

参考资料

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