Ich habe gerade erfahren, dass Linux einen sudo !!
Befehl hat, der buchstäblich für sudo
den zuletzt eingegebenen Befehl gilt. Ich hatte noch nie davon gehört.
Ist das eine gemeinsame Kontrolle? Wo finde ich Dokumentation dazu?
Ich habe gerade erfahren, dass Linux einen sudo !!
Befehl hat, der buchstäblich für sudo
den zuletzt eingegebenen Befehl gilt. Ich hatte noch nie davon gehört.
Ist das eine gemeinsame Kontrolle? Wo finde ich Dokumentation dazu?
Antworten:
Dies ist nur Bash-Verknüpfungen. Übrigens nicht sudo!!
. Es ist sudo !!
(beachte das Leerzeichen).
Die !!
In-Bash ist im Grunde eine Erweiterung des vorherigen Befehls.
Schauen Sie sich den Abschnitt "History Expansion" auf der bash-Manpage an:
http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators
Es ist eigentlich sudo !!
, was der Befehl besteht sudo
, mit dem Sie wahrscheinlich vertraut sind, und ein Ereignis Bezeichner , !!
, das bezieht sich auf den letzten Befehl eingegeben. Weitere Informationen finden Sie in der bash
Manpage unter der Event Designators
Rubrik.
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.
Diese Funktionstrennung ist eines der schönsten Gestaltungsprinzipien, die Linux / Unix so viel leistungsfähiger machen als andere Alternativen, bei denen jedes Programm eine eigenständige Insel von Konventionen und Funktionen darstellt.
"Lassen Sie jedes Programm eine Sache machen und machen Sie es gut"
Anstatt zu implementieren !! in sudo (oder einem anderen Befehl), der von der Wiederholung des vorherigen Befehls profitieren kann - es wird einmal (in den Shells) implementiert und alle Befehle können davon profitieren. Sie können also Folgendes tun:
$ 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
und so weiter.
Aber es endet nicht hier. Die Shell bietet viel mehr als die Erweiterung der Geschichte über die! Ereignisbezeichner. Bevor Sie Ihren Befehl ausführen, werden Variablenerweiterungen, Platzhaltererweiterungen für Dateinamen (Globbing), Befehlsersetzungen, Datei- / E / A-Umleitungen und vieles mehr ausgeführt. All dies kann genutzt und in jedem Befehl verwendet werden, der von der Shell aus aufgerufen wird.
Ein weiterer großer Vorteil ist, dass Sie, wenn Sie etwas Zeit mit dem Erlernen Ihrer Shell verbringen (in diesem Fall "man bash"), diese einmal erlernen müssen und diese leistungsstarken Funktionen jederzeit und überall nutzen können. Es ist viel einfacher, einen Satz leistungsfähiger Prinzipien und Konventionen zu lernen, als neu zu lernen, wie Befehlszeilen-Agrs in jedem Programm oder Dienstprogramm behandelt werden.