Gibt es eine Möglichkeit, eine Änderung des Bash-Verlaufs rückgängig zu machen?

9

Durch Drücken von oben kann ich zuvor eingegebene Befehle durchgehen. Ich habe jedoch bemerkt, dass wenn ich einen von ihnen ändere, dies die Geschichte verändert. Zum Beispiel, wenn ich tippe:

echo a
echo b
echo c
[up][up][backspace]d[ctrl+c]

Die Geschichte zeigt nun, dass der zweite Befehl echo dnicht war echo b. Wie behalte ich den ersten echo bin der Geschichte?

Angenommen, ich führe einen sehr langen Befehl mit vielen Optionen aus. dann möchte ich es mit einer geringfügigen Änderung erneut ausführen, also gehe ich den Verlauf durch, um es zu finden, nehme die Änderung vor, stelle dann aber fest, dass ich es eigentlich nicht erneut ausführen muss, da ich gerade an eine andere Option gedacht habe stattdessen zu tun. dann später möchte ich zurückgehen und mich daran erinnern, was der Befehl war, den ich ausgeführt habe - aber warte, die Geschichte zeigt jetzt das Falsche!

Das kommt sehr selten vor, aber wenn doch, finde ich es wirklich irritierend. Gibt es eine Möglichkeit, die ursprüngliche Geschichte automatisch beizubehalten?

Benubird
quelle
1
mit historykönnen Sie alle Befehle sehen. Nachdem Sie auswählen können, was Sie benötigen. Welche Shell benutzt du gerade?
Hastur
6
Das kann ich nicht reproduzieren. Wenn ich c in d ändere, drücke STRG + C und drücke erneut [auf], heißt es immer noch echo c.
Martin von Wittich

Antworten:

6

Versuchen Sie, in Ihre ~/.inputrc

 set revert-all-at-newline on

In einigen Fällen finden Sie es im Standardwert (Aus).
Es sollte erzwingen readline, alle Änderungen an Verlaufszeilen rückgängig zu machen, bevor bei der accept-lineAusführung zurückgegeben wird. (mehr Infos in man bash).

Edit:
CTRL+c und set revert-all-at-newline onfunktioniert seitdem einwandfrei bash-4.3.30.

# GNU bash, version 4.3.30(1)-release
# Emacs-mode

echo c
[up][backspace]d[Ctrl+c][up] # you should see echo c

Aber:

echo c
[up][backspace]d[down][Ctrl+r]echo[Ctrl+j][Ctrl+c][up] # you should see echo d
Hastur
quelle
Schön, das ist die bessere Lösung. Interessanterweise wird STRG-c tatsächlich dazu führen, dass der geänderte Wert gespeichert wird. Wenn Sie jedoch die Zeile vollständig löschen oder den Pfeil nach unten drücken und dann die Eingabetaste drücken oder einen anderen Befehl ausführen, wird der Verlauf wiederhergestellt.
Dean Serenevy
@ DeanSerenevy: Danke Ich mag auch Ihre Problemumgehung und ich beginne auch STRG-a nanozu verwenden :-)
Hastur
4

In der Regel:

CTRL-a # ENTER

werde es tun.

Der ursprüngliche Befehl wird gespeichert, wenn Sie den geänderten Befehl ausführen. Natürlich möchten Sie nicht wirklich ausführen, also können Sie die Zeile mit auskommentieren #.

In Ihrem Beispiel, würden Sie dann in Ihrer Geschichte haben: echo a, echo b, echo c, # echo d.

Dean Serenevy
quelle
1
Sie können drücken alt-shift-3, um die aktuelle Befehlszeile zu kommentieren, wenn Ihre Bash verwendet wird readline. /insert-commentin man 3 readline(oder man bash) für weitere Informationen.
Cychoi