前言其实不起眼的“!”在Linux中有许多惊人的用途。本文就来盘点那些“!”的神奇用法。执行上一条命令例如执行完上面的命令后,可以用下面的方法再次执行前面的命令:$whereisbash#executethecommandbash:/bin/bash/etc/bash.bashrc/usr/share/man/man1/bash.1.gz$!!#再次执行最后一条命令whereisbashbash:/bin/bash/etc/bash.bashrc/usr/share/man/man1/bash.1.gz!!代表最后执行的命令。可以看到,当输入两个感叹号时,它显示最后一条命令,同时执行最后一条命令。当然,通常我们也会想到用“UP”键来完成。但是如果是基于前面命令的扩展,!!会更方便。比如你想查看一个文件,但是忘记输入more:$/opt/user/test.txt#忘记输入more$more!!#这样会不会快很多?使用!!是不是更方便?使用上一个命令的第一个或最后一个参数来执行命令使用上一个命令的最后一个参数比如你用ls列出目录的内容时,你没有带任何参数,但是想再次执行,带上-al参数,又不想输入长参数,可以使用如下方法:$ls/proc/1/task/1/net/tcp/proc/1/task/1/net/tc$ls-al!$ls-al/proc/1/task/1/net/tcp-r--r--r--1rootroot0Dec2217:30/proc/1/task/1/net/tcp中的!$表示上一个命令的最后一个参数。使用上一个命令的第一个参数和使用上一个命令的最后一个参数只需要使用!^,例如:$ls-al!^去掉最后一个参数执行最后一个命令如果要执行最后一个命令,但我不想带最后一个参数:$ls-aldir#Assumethatdir是一个很长的字符串$!:-ls-al在什么情况下可能会被使用?比如你上一个命令***a参数是一个很长的字符串,你就是不想用,退格键delete又慢,可以用上面的方法。使用上一条命令的所有参数。如上所述,使用最后一个命令的最后一个参数。如果不是最后一个参数,怎么用呢?非常简单,只需使用!*。比如我们输入find命令错误,想更正:$fin-name"test.zip"#Findiswrongenteredhere。$find!*find./-name"test.zip"./workspaces/shell/find/test.zip./workspaces/shell/test.zip可能有读者会问我是否只想使用其中一个参数?遵循![命令名称]:[参数编号]的规则。例如:$cp-rfdiradirb/#Copydiratodirb$ls-l!cp:2#查看dira的内容ls-ldiratotal0-rw-rw-r--1hybhyb012月2217:45testfile当最后一个命令的参数很长,中间要用一个参数,效果比较明显。执行历史中的命令我们都知道可以通过历史命令查看之前执行过的命令,但是如何再次执行历史中的命令呢?我们可以用“UP”键来查看,但是当history命令很长的时候,就不太方便了,这次用“!”派上用场了:$history(这里省略更多内容)2043touch./dira/testfile2044cp-rfdiradirb/2045ls-aldira2046ls-ldira2047ls-aldira2048ls-ldira2049ls-aldira2050ls-ldira2051history我们可以看到,history命令出来的时候可以看到命令之前已经执行过,你也会看到它前面有一个值。如果我们要执行前面的cp-rfdiradirb/命令,其实只需要使用下面的方法即可:$!2044#2044是执行的第n条命令cp-rfdiradirb/,也就是通过方法of![historicalcommandvalue]执行历史命令。当然,如果我们要执行倒数第二条命令,还有一个方法:$!-2#感叹号后跟一个负数,负数代表倒数第二条命令根据关键字执行历史命令!您可以根据关键字执行命令。执行最后一个以关键字开头的命令例如执行最后一个查找命令:$!find#执行最后一个以find开头的命令执行最后一个包含关键字的命令例如执行最后一个包含名称的命令:$find./-name"test"./test./find/test$!?name?find./-name"test"./test./find/test替换上一条命令的参数例如:$find./-name"old*"-a-name"*.zip"如果我??们需要把这个命令中的旧的替换成新的:$!!:gs/old/new这个的逻辑否定是它最熟悉的功能,比如删除所有文件除了cfg结尾:rm!(*.cfg)#删除需谨慎,此处不再详述。总结感叹号“!”的作用有时候确实很神奇。可能只是上面提到的!与其他字符组合起来代表某种特定含义的某种用法,其实我们可以通过组合或者扩展来寻找更多神奇的用法。这里就不展开了。你还有什么好的发现吗?作者介绍Watchman:一个文采不错,技术不错的开发者。将Linux/C/C++/算法/工具等原创技术文章和学习资源分享到我的个人公众号[编程珠玑],期待一起交流学习!
