Wo finde ich Dokumentation zum Befehl „sudo !!“?

20

Ich habe gerade erfahren, dass Linux einen sudo !!Befehl hat, der buchstäblich für sudoden zuletzt eingegebenen Befehl gilt. Ich hatte noch nie davon gehört.

Ist das eine gemeinsame Kontrolle? Wo finde ich Dokumentation dazu?

Pier-Alexandre Bouchard
quelle
4
Möglicherweise möchten Sie commandlinefu.com/commands/browse/sort-by-votes auschecken . Einige wirklich nette Abkürzungen dort.
Leo
2
Siehe auch diese Antwort
Michael Mrozek

Antworten:

36

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

cjc
quelle
Ich habe meinen vorherigen Beitrag bearbeitet, ich habe das Leerzeichen vergessen, wie du gesagt hast!
Pier-Alexandre Bouchard
Oh, ich habe diese Abkürzung nirgendwo gesehen!
Pier-Alexandre Bouchard
29

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 bashManpage unter der Event DesignatorsRubrik.

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.
Kevin
quelle
3

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.

Arielf
quelle