Wie kann man verhindern, dass Bash die Geschichte verändert?

25

Wenn ich die Nach-oben- oder Nach-unten-Taste auf meiner Tastatur drücke und dann etwas aus meinem Verlauf ändere, wird es für immer geändert. Auch wenn ich Strg-C drücke und dann versuche, es erneut aufzurufen, hat sich das geändert - ich habe diesen Eintrag in meinem Verlauf verloren.

Wie kann ich das verhindern?

Mehrdad
quelle
3
Ich liebe den Titel dieser Frage. Sie können tatsächlich die Geschichte verändern und Sie beschweren sich? Was stimmt nicht mit dir?!
Daniel Beck
@ Daniel: Lol, ja ... ich meine, es ist, als würde ich meine Vergangenheit ändern. Klar unsinnig, und es wird nach einer Weile lächerlich nervig. : \
Mehrdad
Übrigens, wenn Sie stattdessen history-search-xxx verwenden, ist das Verhalten anders. Vielleicht ist das was für dich?
Daniel Beck
@ Daniel: Das ist in der Tat nützlich - vielen Dank. Trotzdem würde ich gerne die Antwort auf diese Frage wissen, da die Befehle manchmal nicht so ähnlich aussehen und das nicht funktioniert.
Mehrdad
Die Verlaufssuche mit einer leeren Eingabeaufforderung funktioniert genauso wie die normale Verlaufssuche prev / next, dh es werden alle Einträge angezeigt.
Daniel Beck

Antworten:

16

Sie möchten die Readline-Einstellung:

set revert-all-at-newline on

Sie können es entweder in ~/.inputrc(siehe Hinweis unten) oder bind 'revert-all-at-newline on'in Ihre einfügen ~/.bashrc.

Demo:

$ man bash
$ bind 'set revert-all-at-newline on'
$ man bsh # up arrow and edit
No manual entry for bsh
$ man bash # three up arrows

Weitere Details finden Sie in der Bash-Manpage :

revert-all-at-newline

Bei der Einstellung ' on' macht Readline alle Änderungen an den Verlaufszeilen rückgängig, bevor es bei Ausführung von accept-line zurückkehrt. Standardmäßig können Verlaufszeilen geändert werden und einzelne Rückgängig-Listen für alle Aufrufe von readline behalten. Der Standardwert ist ' off'.


Hinweis:

Wenn zum ~/.inputrcEinstellen eine neue Datei erstellt revert-all-at-newlinewird, beachten Sie, dass bash die Readline-Einstellungen in dieser Datei anstelle der Einstellungen in der Datei verwendet /etc/inputrc. Das heißt, alle in angegebenen Einstellungen /etc/inputrcsind nicht mehr wirksam. Wenn die /etc/inputrcDatei vorhanden ist, sollten Sie daher ~/.inputrcmit der folgenden Zeile beginnen:

$include /etc/inputrc

Sarnold
quelle
Du bist großartig, genau das brauche ich. Ich möchte meinen Monitor nicht mehr schlagen. : D +1000000 (ich wünschte)
Mehrdad
5

Ich betrete:

ls /tmp

- wunderbar. Jetzt will ich nicht eintreten

ls /temp 

und kann verhindern, dass es in den Verlauf eingibt, daher verhindern, dass es ls / tmp überschreibt, wenn ich den Befehl mit einem Leerzeichen starte:

 ls /temp

Es ist schwer zu sehen, aber wenn Sie es wissen ...

Es wird gesteuert von

export HISTCONTROL=ignoredups
export HISTCONTROL=ignoreboth

ignoredups ignoriert nur doppelte Befehle, ignoriert beide Leerzeichen am Zeilenanfang, was nützlich ist, um ansonsten nicht versteckte Passwörter zu verbergen.

Aber vielleicht suchen Sie nach einer Lösung, bei der Sie mit beiden Befehlen enden, dem unmodifizierten alten und dem neuen. Meine Version von Bash oder Einstellungen verhält sich wie folgt, aber ich weiß nicht, was sich von Ihrer unterscheidet.

Benutzer unbekannt
quelle
Ha; Ich bin immer davon ausgegangen, dass das Speichern von Befehlen mit einem führenden Leerzeichen ein Fehler ist. Vielen Dank. :)
Sarnold