¿Dónde puedo encontrar documentación sobre el comando "sudo !!"

20

Acabo de enterarme de que Linux tiene un sudo !!comando que literalmente se aplica sudoal último comando ingresado. Nunca había escuchado sobre eso.

¿Es ese un control común? ¿Dónde puedo encontrar documentación al respecto?

Pier-Alexandre Bouchard
fuente
44
Es posible que desee consultar commandlinefu.com/commands/browse/sort-by-votes . Algunos atajos realmente buenos allí.
Leo
2
Ver también esta respuesta
Michael Mrozek

Respuestas:

36

Esto es solo atajos bash. No lo es sudo!!, por cierto. Es sudo !!(tenga en cuenta el espacio).

El !!en bash es básicamente una expansión de la orden anterior.

Eche un vistazo a la sección "Expansión del historial" de la página de manual de bash:

http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators

cjc
fuente
Edité mi publicación anterior, ¡olvidé el espacio como dijiste!
Pier-Alexandre Bouchard
¡Oh, nunca vi este atajo en ninguna parte!
Pier-Alexandre Bouchard
29

En realidad sudo !!, la cual consiste en el comando sudo, con el que es probablemente familiar, y un designador de evento , !!que se refiere al último comando introducido. Puede encontrar más en la bashpágina de manual, en la Event Designatorssección.

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.
Kevin
fuente
3

Esta separación de funcionalidad es uno de los principios de diseño más bellos que hacen que Linux / Unix sea mucho más poderoso que otras alternativas en las que cada programa es una isla independiente separada de convenciones y capacidades.

"haz que cada programa haga una cosa y hazlo bien"

En lugar de implementar !! dentro de sudo (o cualquier otro comando) que puede beneficiarse de repetir el comando anterior: se implementa una vez (en los shells) y todos los comandos pueden beneficiarse de él. Entonces puedes hacer:

$ 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

y así.

Pero no termina aquí. ¡El shell hace mucho más que expandir la historia a través de! designadores de eventos. Antes de ejecutar su comando, realiza expansión variable, expansión de comodines de nombre de archivo (globbing), sustitución de comandos, redirección de archivo / E / S y mucho más. Todo lo cual se puede aprovechar y usar en cualquier comando que se invoque desde el shell.

Otra gran ventaja es que si pasas un tiempo aprendiendo tu shell ('man bash' en este caso) necesitas aprenderlo una vez y puedes usar estas poderosas capacidades en todas partes, todo el tiempo. Es mucho más fácil aprender un conjunto de principios y convenciones poderosas, en lugar de volver a aprender cómo se manejan las líneas de comando en cada programa o utilidad.

arielf
fuente