Come fa !! lavorare a bash?


34

Molto utile quando si dimentica un sudo all'inizio del comando, si !!comporta come un alias del comando precedente. Esempio :

$ mv /very/long/path/for/a/protected/sensible/file/caution.h .
(...) Permission denined
$ sudo !!
sudo mv /very/long/path/for(...) .
[sudo] password :
  • Come chiamiamo quel doppio !!trucco? Le ricerche su Internet sono difficili a causa di quel token.
  • Come funziona ? Sospetto un collegamento con il comando cronologia.
  • Dove è definito? Posso definirne qualcun altro?

EDIT: alcuni interessanti designatori di eventi

!!:*

Si riferisce agli argomenti del comando precedente. Caso d'uso :

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

:p

Basta stampare il comando senza eseguirlo, è necessario inserirlo alla fine del designatore di eventi.

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

Maggiori informazioni qui .


3
Leggiman history
Costas

1
È un caso speciale di espansione della cronologia, in cui la shell tenta di espandere una parola iniziando con !un comando corrispondente nell'elenco cronologico della shell corrente. !!è un caso speciale, equivalente a !-1, in cui un numero negativo che nsegue si !riferisce all'ennesimo comando precedente.
Chepner,

1
@Costas, più utilmente, leggi LESS='+/^HISTORY EXPANSION' man bash.
Wildcard il

Risposte:


34

!!è elencato nel bashmanuale alla voce "Designatori di eventi":

   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.

Quindi !!verrà sostituito con il comando precedente.

Si noti che la cronologia della shell non conterrà il valore letterale !!ma invece il comando effettivo che è stato eseguito:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.