Это - просто ярлыки удара. Это не sudo!!
, между прочим. Это sudo !!
(отметьте пространство).
!!
в ударе в основном расширение предыдущей команды.
Смотрите на раздел "History Expansion" страницы справочника удара:
http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators
Это на самом деле 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.
Это разделение функциональности является одним из самых красивых принципов разработки, делающих Linux/Unix, настолько более мощный, чем другие альтернативы, где каждая программа является отдельным независимым островом конвенций и возможностей.
"заставьте каждую программу сделать одну вещь и сделать это хорошо"
Вместо реализации!! внутри sudo (или любая другая команда), который может извлечь выгоду из повторения предыдущей команды - это реализовано однажды (в оболочках), и все команды могут извлечь выгоду из него. Таким образом, можно сделать:
$ 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
и так далее.
Но это не заканчивается здесь. Оболочка делает намного больше, чем расширяющаяся история через! указатели события. Прежде, чем выполнить Вашу команду, это делает переменное расширение, подстановочное расширение имени файла (globbing), управляет заменой, file/IO перенаправление, и многое другое. Все из которых могут усиливаться и использоваться в любой команде, это вызывается от оболочки.
Другое большое преимущество состоит в том, что при пребывании в течение некоторого времени, изучая оболочку ('удар человека' в этом случае) необходимо изучить это однажды, и можно использовать эти мощные возможности везде все время. Намного легче изучить один набор мощных принципов и конвенций, вместо того, чтобы повторно изучить, как командная строка agrs обрабатывается в каждой программе или утилите.