Der History-Befehl

Der History-Befehl

Häufig gebe ich im Terminal einen Befehl ein (obwohl ich davon ausgehe, dass jede Antwort in Bash und den meisten anderen funktioniert) und erhalte dann aufgrund eines fehlenden . eine Art Berechtigungsfehler sudo.

Okay, also drücke „hoch“, halte/hämmere „links“, tippe sudound drücke „Enter“.

Das ist ärgerlich. Umso mehr, je länger der Befehl war.

Beachten Sie, dass das Fehlen sudoder schlimmste Fall ist; ein Tippfehler näher am Anfang als am Ende ist ähnlich ärgerlich.

Was ich gerne hätte, wäre eine Möglichkeit, eine Art „Auf und Home“-Tastendruck auszuführen. Eigentlich könnten diese beiden Tastendrücke das vielleicht tun – aber meine Macbook-Tastatur hat keinen Home-Tastendruck, also kann ich es nicht versuchen.

Bonuspunkte gibt es sudoauch für eine Möglichkeit, automatisch einzufügen und die Eingabetaste zu drücken, etwa mit CMD+Umschalt+S.


Ist das möglich oder träume ich?

Antwort1

Verwenden Sie einfach UPund CTRL-A.

Beide !sudofunktionieren sudo !!problemlos. Mit einem Unterschied:

  • sudo !!führt den letzten Befehl aus dem Verlauf sudoam Anfang aus.

  • !sudoführt den letzten Befehl im Verlauf aus, der mit begonnen hat sudo.

  • Normalerweise CTRL-Abringt Sie das an den Anfang der Zeile in einem Linux-Terminal und CTRL-Eans Ende.
    Wenn Sie möchten, können Sie Ihre Strategie weiterverwenden. Sie müssen nur die Verknüpfung Ihres Systems herausfinden. Sie finden eine Liste vonVerknüpfungenim Grafik- und TextumfeldzB hier.

Nur einWarnung: sudo !!und !sudofunktionieren wirklich schnell undSie haben keine visuelle Kontrolle über die Zeile, die Sie als Superuser ausführenDies kann zur Folge habenschädlichmanchmal. Besonders wenn Ihnen ein Druckfehler unterläuft.

Machen wir ein dramatisches Beispiel:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

Zu spät, Sie haben gerade Ihr Home-Verzeichnis und alle Unterordner gelöscht!!.

Wenn Sie einen Befehl mit einem Leerzeichen als erstem Zeichen schreiben, ist es möglich, dass er nicht im Verlauf endet. Dies hängt vom Wert der Variable $HISTCONTROL ab. Wenn die Liste ihrer Werte enthältLeerzeichen ignorieren(oderbeide ignorieren) die Zeilen, die mit einem Leerzeichen beginnen, werden nicht in der Verlaufsliste gespeichert. Mit sudo!! führen Sie also den letzten Befehl davor aus.

Sie können sich eine ähnliche Situation mit vorstellen !sudo. Es wird der letzte im Verlauf aufgezeichnete Befehl ausgeführt sudo, der mit beginnt. Wenn jedoch der letzte, an den Sie sich erinnern, mit einem Leerzeichen begann, … wissen Sie jetzt, dass Sie ein anderes verwenden werden.

Letzter Hinweis: Je dramatischer Ihr Fehler ist, desto hinterhältiger kann er sein, weil er unbemerkt vorübergehen kann ... und Sie laufen Gefahr, zur Zahlung aller Zinsen für eine Rechnung aufgefordert zu werden, an die Sie sich nicht erinnern können.


Update (Bash ist großartig):
Bei neueren Versionen von Bash ist es möglich, dieses gefährliche Verhalten mit dem folgenden Befehl zu beheben, den ich in die Datei einfüge ~/.bashrc:

shopt -s histverify

Von man bashkönnen Sie lesen

Wenn dashistverifyShell-Option ist aktiviert undZeile lesenwird benutzt,Verlaufsersetzungen werden nicht sofort an den Shell-Parser übergeben.Stattdessen wird die erweiterte Zeile zur weiteren Bearbeitung erneut in den Readline-Bearbeitungspuffer geladen.

So können Sie den auszuführenden Befehl lesen und bei Bedarf ändern.
Da dies in vielen Distributionen nicht die Standardeinstellung ist,wir müssen uns trotzdem daran erinnern, wenn wir andere Konten verwenden.

Antwort2

Hier sind einige gängige Tastaturkombinationen, die in vielen Mac- und Linux-Programmen verwendet werden (ich bin mir allerdings nicht sicher, welche von den meisten Windows-Apps verwendet werden):

  • CTRL-A- Bringen Sie den Cursor an den Anfang der aktuellen Zeile
  • CTRL-E- Bringen Sie den Cursor an das Ende der aktuellen Zeile
  • CTRL-Left- Bewegen Sie den Cursor ein Wort zurück
  • CTRL-Right- Bewegen Sie den Cursor ein Wort vorwärts

Antwort3

Verwenden

sudo !!

Es !!wird durch den kompletten vorherigen Befehl ersetzt.

Antwort4

@WChargin hat in Bezug auf Recht !sudo, deshalb ändere ich meine Antwort ...

sudo !!ist, wie viele gesagt haben, die richtige Antwort.

Nur für den Fall füge ich hier Folgendes ein, in Bezug auf den historyBefehl und wie dieser !Befehl funktioniert. Ich hoffe, das hilft.


Der History-Befehl

Mit dem Befehl „history“ können Sie das Bash-Protokoll der von Ihnen eingegebenen Befehle auflisten:

Dieses Protokoll wird als „Verlauf“ bezeichnet. Um darauf zuzugreifen, geben Sie Folgendes ein:

history n 

Dadurch werden nur die letzten n Befehle aufgelistet. Geben Sie „history“ (ohne Optionen) ein, um die gesamte Verlaufsliste anzuzeigen.

Sie können auch Folgendes eingeben:!num den Befehl Nummer n auszuführen. Verwenden Sie!!um den zuletzt eingegebenen Befehl auszuführen.

!-nführt den Befehl n-mal aus (mit anderen Worten!-1ist äquivalent zu!!).

!stringführt den letzten Befehl aus, der mit diesem „String“ beginnt und !?string?führt den letzten Befehl aus, der das Wort „string“ enthält. Beispiel:

!cdführt den Befehl, den Sie zuletzt eingegeben haben und der mit „cd“ beginnt, erneut aus.

commandName !*führt den „commandName“ mit allen Argumenten aus, die Sie bei Ihrem letzten Befehl verwendet haben. Dies kann beispielsweise nützlich sein, wenn Sie einen Rechtschreibfehler machen. Wenn Sie Folgendes eingegeben haben:

emasc /home/fred/mywork.java /tmp/testme.java 

Der Versuch, Emacs auf die beiden oben genannten Dateien anzuwenden, schlägt offensichtlich fehl. Sie können also Folgendes eingeben:

emacs !* 

Dadurch wird Emacs mit den Argumenten ausgeführt, die Sie zuletzt in der Befehlszeile eingegeben haben. Mit anderen Worten entspricht dies der Eingabe von:

emacs /home/fred/mywork.java /tmp/testme.java

~Der Befehlszeilenverlauf

verwandte Informationen