我刚刚了解到 Linux 有一个sudo !!
命令实际上适用sudo
于最后输入的命令。我从来没有听说过。
这是一个共同的控制吗?我在哪里可以找到有关它的文档?
答案1
这只是 bash 快捷方式。sudo!!
顺便说一句,事实并非如此。是sudo !!
(注意空格)。
bash 中的命令!!
基本上是前一个命令的扩展。
看一下 bash 手册页的“历史扩展”部分:
http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators
答案2
实际上,它由您可能熟悉的sudo !!
命令和一个组成sudo
事件指示符, !!
,指最后输入的命令。您可以在bash
手册页的 参考资料 部分中找到更多信息Event Designators
。
Event Designators
An event designator is a reference to a command line entry in the his‐
tory list. Unless the reference is absolute, events are relative to
the current position in the history list.
! Start a history substitution, except when followed by a blank,
newline, carriage return, = or ( (when the extglob shell option
is enabled using the shopt builtin).
!n Refer to command line n.
!-n Refer to the current command minus n.
!! Refer to the previous command. This is a synonym for `!-1'.
!string
Refer to the most recent command preceding the current position
in the history list starting with string.
!?string[?]
Refer to the most recent command preceding the current postition
in the history list containing string. The trailing ? may be
omitted if string is followed immediately by a newline.
^string1^string2^
Quick substitution. Repeat the previous command, replacing
string1 with string2. Equivalent to ``!!:s/string1/string2/''
(see Modifiers below).
!# The entire command line typed so far.
答案3
这种功能分离是最美丽的设计原则之一,使得 Linux/Unix 比其他替代方案更强大,其中每个程序都是一个独立的约定和功能岛。
“让每个程序只做一件事,并且做好”
而不是实施!!在 sudo (或任何其他命令)内部,可以从重复前一个命令中受益——它被实现一次(在 shell 中),所有命令都可以从中受益。所以你可以这样做:
$ echo !! # will echo the last command
$ time !! # will repeat and time the last command
$ strace !! # will repeat the last program while system-call tracing it
等等。
但事情并没有就此结束。 shell 的作用远不止通过 !事件指示符。在执行命令之前,它会执行变量扩展、文件名通配符扩展(通配符)、命令替换、文件/IO 重定向等等。所有这些都可以在从 shell 调用的任何命令中利用和使用。
另一个很大的优点是,如果您花一些时间学习 shell(在本例中为“man bash”),您只需学习一次,就可以随时随地使用这些强大的功能。学习一组强大的原则和约定要容易得多,而不是重新学习每个程序或实用程序中如何处理命令行 agr。