Bra*_* D. 4 bash command-history
为什么我不能使用“!” 尝试在终端中回显消息时?例如:
echo -e "Hello\nWorld!"
Run Code Online (Sandbox Code Playgroud)
bash 返回以下命令:
bash !: event not found
Run Code Online (Sandbox Code Playgroud)
该!字符称为“bang”,bash用于调用命令历史记录。您可以通过四种方式使用它:
!<firstFewCharsOfPreviousCommand>
Run Code Online (Sandbox Code Playgroud)
例子:
!rm
Run Code Online (Sandbox Code Playgroud)
这将转到您执行的最后一个以“rm”开头的命令并执行整个操作。重复具有潜在破坏性的命令(如 rm)时要小心,因为您可能会无意中执行另一个超出您预期的命令。以上只是说明,使用 bash 的CTRL-R反向搜索功能是一个更安全的选择。
!<indexInCommandHistory>
Run Code Online (Sandbox Code Playgroud)
例子:
!433
Run Code Online (Sandbox Code Playgroud)
索引是运行命令时出现在命令旁边的数字history。
!!
Run Code Online (Sandbox Code Playgroud)
没有必要的例子,因为这就是它的全部。它重新执行前一个命令(与大多数 Linux 发行版上的向上箭头相同)。
!$
Run Code Online (Sandbox Code Playgroud)
例子:
# ls -lh /etc/fstab
# vi !$
Run Code Online (Sandbox Code Playgroud)
另一个字面量,当 bash 执行这个时, the!$被最后一个单词(不带空格的字符串)替换
正如您在最后一个中看到的那样,您甚至可以将它用作更大或不同命令的一部分。另一个例子!!:
[root@hypervisor libsceptre]# echo hey
hey
[root@hypervisor libsceptre]# echo !!
echo echo hey <-- printed to stderr so you know what !! was expanded to
echo hey
[root@hypervisor libsceptre]#
Run Code Online (Sandbox Code Playgroud)
如果您希望 bash 出于某种原因将字符视为文字而不是尝试解释它,请将文本放在单引号中:
[root@hypervisor libsceptre]# echo -e "Hello\nWorld!"
-bash: !": event not found
[root@hypervisor libsceptre]# echo -e 'Hello\nWorld!'
Hello
World!
[root@hypervisor libsceptre]#
Run Code Online (Sandbox Code Playgroud)
您的命令不起作用的原因是它试图找到您编写的最后一个以双引号开头的命令(我的第一个示例中描述的功能)并且找不到它。