Dove posso trovare la documentazione sul comando "sudo !!"


20

Ho appena imparato che Linux ha un sudo !!comando che si applica letteralmente sudoall'ultimo comando inserito. Non ne avevo mai sentito parlare.

È un controllo comune? Dove posso trovare la documentazione al riguardo?


4
Potresti voler dare un'occhiata a commandlinefu.com/commands/browse/sort-by-votes . Alcune scorciatoie davvero belle lì.
Leo,

Risposte:


36

Queste sono solo scorciatoie da bash. A sudo!!proposito, non lo è. È sudo !!(nota lo spazio).

In !!bash è sostanzialmente un'espansione del comando precedente.

Dai un'occhiata alla sezione "History Expansion" della pagina man di bash:

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


Ho modificato il mio precedente post, ho dimenticato lo spazio come hai detto!
Pier-Alexandre Bouchard,

Oh, non ho mai visto questa scorciatoia da nessuna parte!
Pier-Alexandre Bouchard,

29

In realtà sudo !!, è costituito dal comando sudocon cui probabilmente hai familiarità e da un designatore di eventi ,!! che si riferisce all'ultimo comando immesso. Puoi trovare di più nella bashpagina man, sotto la Event Designatorssezione.

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

Questa separazione di funzionalità è uno dei principi di progettazione più belli che rendono Linux / Unix molto più potente di altre alternative in cui ogni programma è un'isola indipendente separata di convenzioni e capacità.

"fai fare a ogni programma una cosa e fallo bene"

Invece di implementare !! dentro sudo (o qualsiasi altro comando) che può trarre vantaggio dalla ripetizione del comando precedente - viene implementato una volta (nelle shell) e tutti i comandi possono trarne beneficio. Quindi puoi fare:

$ 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

e così via.

Ma non finisce qui. La shell fa molto di più che espandere la storia tramite il! designatori di eventi. Prima di eseguire il comando, esegue l'espansione variabile, l'espansione jolly dei nomi di file (globbing), la sostituzione dei comandi, il reindirizzamento di file / IO e molto altro. Tutto ciò può essere sfruttato e utilizzato in qualsiasi comando richiamato dalla shell.

Un altro grande vantaggio è che se passi un po 'di tempo ad imparare la tua shell (in questo caso "man bash") devi impararla una volta e puoi usare queste potenti capacità ovunque, sempre. È molto più facile apprendere un insieme di principi e convenzioni potenti, piuttosto che riapprendere come vengono gestiti gli agr della riga di comando in ciascun programma o utilità.

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.