Ho appena imparato che Linux ha un sudo !!
comando che si applica letteralmente sudo
all'ultimo comando inserito. Non ne avevo mai sentito parlare.
È un controllo comune? Dove posso trovare la documentazione al riguardo?
Ho appena imparato che Linux ha un sudo !!
comando che si applica letteralmente sudo
all'ultimo comando inserito. Non ne avevo mai sentito parlare.
È un controllo comune? Dove posso trovare la documentazione al riguardo?
Risposte:
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
In realtà sudo !!
, è costituito dal comando sudo
con cui probabilmente hai familiarità e da un designatore di eventi ,!!
che si riferisce all'ultimo comando immesso. Puoi trovare di più nella bash
pagina man, sotto la Event Designators
sezione.
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.
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à.