Wie kann ich die Bash-Bearbeitung des Verlaufs beenden, wenn ich einen Eintrag wiederverwende und ändere?


20

Einige Instanzen von bash ändern den Befehlsverlauf, wenn Sie einen vorherigen Befehl wiederverwenden und bearbeiten, andere anscheinend nicht. Ich habe gesucht und gesucht, aber nichts gefunden, das besagt, wie verhindert werden kann, dass Befehle im Verlauf geändert werden, wenn sie wiederverwendet und bearbeitet werden.

Es gibt Fragen wie diese , aber das scheint zu sagen, wie man mit der Geschichte umgeht, die bearbeitet wird. Ich bin erst kürzlich auf eine Bash-Instanz gestoßen, die den Verlauf bearbeitet, wenn Sie einen Befehl wiederverwenden. Alle vorherigen Bash-Shells, die ich verwendet habe, wurden (soweit mir bekannt ist) so konfiguriert, dass sie den Verlauf nicht ändern, wenn Sie sie wiederverwenden und bearbeiten Sie einen Befehl. (Vielleicht habe ich in den letzten 15 Jahren meiner Shell-Geschichte einfach nicht genug Aufmerksamkeit geschenkt ...)

Das ist wahrscheinlich die beste Frage: KANN ich bash NIEMALS sagen, dass die Historie geändert werden soll - und wenn ja, wie?


Mit können history -pSie Verlaufserweiterungen durchführen, ohne die Verlaufsdatei zu beeinflussen. Sie können dasselbe history -stun und an den Verlauf anhängen, ohne ihn auszuführen. Sie können HISTIGNORE='start of a command I never want in history.*:command2.*'bestimmte Befehle aus dem Verlauf entfernen.
mikeserv

1
set revert-all-at-newline onLösen die in der Frage, die Sie verlinken, nicht Ihr Problem? Können Sie zeigen, wie das Problem reproduziert werden kann? Beachten Sie, dass Sie auch zshfür ein Verhalten verwenden können, das Ihren Vorstellungen entspricht.
Stéphane Chazelas

@mikeserv Wenn history -pich mir die Manpage anschaue, muss ich das für jeden Befehl tun, den ich wiederverwenden möchte - stimmt das? Wenn ja, ist das nicht ganz das, wonach ich suche. Wie bereits erwähnt, habe ich Bash-Instanzen verwendet, die den Verlauf nicht ändern, wenn ein Befehl erneut verwendet und bearbeitet wird.
Richard Wiseman

@ StéphaneChazelas Nein, ich glaube nicht, dass revert-all-at-newlinees genau das ist, was ich brauche. Wenn ich einen Befehl bearbeite und STRG-C drücke, um ihn abzubrechen, soll sich dies auch nicht auf den Verlauf auswirken. Ich musste Bash noch nie konfigurieren , um den Verlauf nicht zu ändern. Dies ist einer der Gründe, warum ich verwirrt bin, warum sich eine Neuinstallation manchmal auf die eine und manchmal auf die andere Weise verhält. Übrigens zeigt in einer Instanz, in der der Verlauf bei der Wiederverwendung von Befehlen nicht bearbeitet wird, a bind -V | grep revertan, dass revert-all-at-newlinedie Option deaktiviert ist.
Richard Wiseman

2
Eigentlich hat das sehr wenig damit zu tun bash. Alles dreht sich um Readline. Es gibt verschiedene Implementierungen der readlineBibliothek, und es hat auch einen eigenen Satz von Einstellungen (eine Menge von ihnen) und eine eigene Konfigurationsdatei. Ich bin mir nicht sicher, ob dies eine Einstellung oder einfach ein Implementierungsunterschied ist, aber Sie sollten in der readline-bezogenen Dokumentation suchen, nicht in der bash.
Orion

Antworten:


9

Es stellt sich heraus, revert-all-at-newlineist die Antwort. Ich musste set revert-all-at-newline onin meine ~/.inputrcDatei aufnehmen, da die Verwendung des setBefehls an der Bash-Eingabeaufforderung keine Auswirkungen hatte. (Dann musste ich natürlich eine neue Shell starten.)

Außerdem habe ich festgestellt, dass ~/.inputrcgeladen wird, anstatt, /etc/inputrc wenn vorhanden, was bedeutet, dass die in letzterem definierten Standardeinstellungen beim Erstellen nicht mehr aktiv sind ~/.inputrc. Um dies zu beheben, beginnen Sie ~/.inputrcmit $include /etc/inputrc.

Vielen Dank an @ StéphaneChazelas für den Hinweis in die richtige Richtung.


0

In ~ / .bashrc können Sie hinzufügen

shopt -s histappend

Danke, aber das hat keinen Einfluss auf das Problem, das ich habe. Ich habe es gerade überprüft und es histappendist aktiviert, aber in meinem Verlauf werden weiterhin Änderungen an vorherigen Befehlen angezeigt.
Richard Wiseman

Ich habe die Bash-Manpage durchsucht und die Regeln für den Bearbeitungsverlauf gefunden. Readline-Befehlsnamen Es ist ziemlich beschreibend, aber ich sehe keine Option für das, was Sie wollen, außer vielleicht: redraw-current-line. Aktualisiere die aktuelle Linie.
Jeff Coleman

Es gibt auch eine Option, die standardmäßig deaktiviert ist
Jeff Coleman,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.