Linux 系统中,“!” 符号或者操作符通常被用做逻辑否定的操作符,同时也通过一些调整和改动命令来从历史记录中找出你需要的命令行。下面演示的命令行在bash Shell中都已经明确检查过可用了。不过我没有在其他的 Shell 解释器下测试过,不过我相信这些命令也不会在其他的解释器下运行。那么现在就让我们学习一下 “!” 这神奇而独特的用法吧!
1.从历史记录中使用命令号来运行命令
你也许从没意识到过可以从命令行历史记录(之前执行过的命令)里执行一条命令,首先输入 “history” 命令得到命令的序号。
这时你可以通过命令 history 的输出中的命令序号来执行一条命令。
上面可以看到它执行了号码为1551的 top 命令,这种执行方式对执行某些特别长的命令非常有用,你只要使用”!”符号加上命令的序号就能执行该命令啦。
2.执行指定的之前执行过的命令
你可以运行 !-1、!-2 或者 !-7 等命令来执行你记录序列中的倒数第一条命令、倒数第二条命令已经倒数第七条等等。。。和上面的方式一样,你需要先用 history 命令来列出命令列表。其实这个命令非常有用,你可以通过它来确定没有执行过某些错误命令比如 “rm command >file” 或者别的危险指令。这里给出了执行倒数第六个、第八个和第十个命令的效果。
3.向一条新命令传递旧命令的参数避免重复输入
比如说我需要列出 ‘/home/$USER/Binary/firefox’ 这个目录。
但是这个时候我又想用 “ls-l“查看这个目录下的具体信息,那么我需要重新输入上面的命令吗?当然不需要,你只要用下面这个命令:
“!$” 符号可以将上一条命令的参数传递给下一条命令参数:
4.如何用(!)处理两个以上的参数?例如我在桌面上创建了一个 1.txt 文件
然后使用CP命令把它复制到 ‘home/avi/Downloads’ 目录
这样我们就向CP命令传递了两个参数。第一个是 ‘/home/avi/Desktop/1.txt’ ,第二个是’/home/avi/Downloads’,为了区分它们,我们 使用 echo 来打印每个参数。
可以注意到第一个参数可以使用 “!^” 来表示,剩下的参数就可以使用 “命令名:参数序号”这种方式来表示,比如 “!cp:2″。再举个例子,如果你执行的某个命令为 “xyz”,命令 后面有5个参数而你想调用第四个参数,就可以使用 “!xyz:4″ 来调用它。当然,你可以使用 “!* “ 来表示所有参数。
5.通过关键词来执行之前的命令
我们可以通过执行关键词来执行之前的命令。可以按照下面的命令来理解:
上面是相同的ls命令对应了不同参数和文件夹。此外我们将每一个标准输出都传递到了 ‘/dev/null’ 因为我们并不希望处理程序的标准输出。现在我们可以调用命令的关键词来实现它们。
当你使用 “ls” 关键词来执行之前命令的时候,你一定会被标准输出给惊讶到。