Cómo !! trabajar en bash?

34

Muy útil cuando olvida un sudo al comienzo de su comando, !!actúa como un alias del comando anterior. Ejemplo:

$ mv /very/long/path/for/a/protected/sensible/file/caution.h .
(...) Permission denined
$ sudo !!
sudo mv /very/long/path/for(...) .
[sudo] password :
  • ¿Cómo llamamos a ese doble !!truco? Las investigaciones por internet son difíciles debido a ese token.
  • Como funciona ? Sospecho un enlace con el comando de historial.
  • ¿Dónde se define? ¿Puedo definir algún otro yo mismo?

EDITAR: algunos designadores de eventos interesantes

!!:*

Se refiere a los argumentos del comando anterior. Caso de uso:

cat /a/file/to/read/with/long/path
nano !!:*

:p

Simplemente imprima el comando sin ejecutarlo, debe colocarlo al final del designador de eventos.

$ !-5:p
sudo rm /etc/fstab -f

Más aquí .

Tótem
fuente
3
Leerman history
Costas
1
Es un caso especial de expansión del historial, en el que el shell intenta expandir una palabra comenzando con !un comando coincidente en la lista del historial del shell actual. !!es un caso especial, equivalente a !-1, donde un número negativo nsiguiente se !refiere al enésimo comando anterior.
chepner
1
@Costas, más útil, lee LESS='+/^HISTORY EXPANSION' man bash.
Comodín

Respuestas:

34

!!aparece en el bashmanual bajo el título "Designadores de eventos":

   An event designator is a reference to a command line  entry  in  the
   history 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 posi-
          tion in the history list starting with string.
   !?string[?]
          Refer to the most recent command preceding the current  posi-
          tion  in  the history list containing string.  The trailing ?
          may be omitted if string is followed immediately  by  a  new-
          line.
   ^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.

Entonces !!será reemplazado con el comando anterior.

Tenga en cuenta que el historial de shell no contendrá el literal !!sino el comando real que se ejecutó:

$ ls
[some output]

$ !! .
[same output]

$ history 3
  645  2016-08-25 17:40:55 ls
  646  2016-08-25 17:40:57 ls .
  647  2016-08-25 17:41:00 history 3
Kusalananda
fuente