Das Skript finden Sie hier:https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell
Der Einfachheit halber ist es hier:
for x in `seq $1 $2`
do
history -d $1
done
Ich lege dies in mein Include-Verzeichnis (eines, das ich dem PATH hinzugefügt habe), wo ich viele andere Skripte ausführe, die ich geschrieben habe und die gut funktionieren.
Dies führt nicht zu dem gewünschten Ergebnis, Zeilen aus meinem Verlauf zu löschen, tatsächlich bewirkt es überhaupt nichts.
Irgendeine Idee, warum der Verlaufsbefehl nicht funktioniert? Ich frage mich, ob es etwas mit den Verzeichnissen zu tun hat.
Zusätzliche Informationen:
Ich habe mit dem Code herumgespielt und verschiedene Varianten ausprobiert. Wenn ich ein echo
setze vor der history
Befehl ausführen und ausführen, erhalte ich die folgende Ausgabe:
[email protected]:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
[email protected]:~$
Also für mich sieht es so aus, als ob es perfekt funktionieren sollte. Ich kann nicht herausfinden, warum. Dieses Skript wird von /$HOME/Scripts/ ausgeführt und wurde in den PATH aufgenommen. Ich habe auch versucht, es mit sudo auszuführen, und es ändert sich nichts.
Akzeptierte Antwort:
In einem Satz:Es funktioniert nicht, weil du es nicht richtig nennst.
Erstens, da Ihr Skript nicht mit #!/bin/bash
beginnt , es ist eigentlich kein Bash-Skript. Von welcher Shell es ausgeführt wird, hängt davon ab, wie Sie es aufrufen. Wenn Sie es über die Bash-Befehlszeile aufrufen, forkt Bash eine neue Instanz von sich selbst (dies muss sowieso passieren, um einen externen Befehl auszuführen), und es ist diese neue Instanz, die das Skript ausführt. Das Skript wird also mit denselben Einstellungen (einschließlich des bisherigen Verlaufs) wie die übergeordnete Shell ausgeführt. Es wird mit verschiedenen Optionen ausgeführt; Insbesondere ist die Verlaufsverfolgung für die Befehle im Skript deaktiviert (was für Sie geeignet ist, da dies sonst zu dem Verlauf hinzugefügt würde, den Sie ändern möchten).
Ob die Bash-Instanz, die das Skript ausführt, die HISTFILE
hat variable set hängt davon ab, ob sie in den Parent exportiert wurde (was etwas seltsam ist). Wenn es nicht exportiert und somit im untergeordneten Skript festgelegt wird, speichert das untergeordnete Skript den geänderten Verlauf nicht, wenn es endet.
Wenn HISTFILE
exportiert wird, ändert das untergeordnete Skript Ihre Verlaufsdatei. Sofern Sie Ihre interaktive Shell jedoch nicht so konfiguriert haben, dass der Verlauf nach jedem Befehl neu geladen wird, wird der geänderte Verlauf nur von neu gestarteten Bash-Instanzen übernommen.
Wenn Sie ein Shell-Snippet ausführen möchten, das sich auf die aktuelle Shell-Instanz auswirkt, müssen Sie diese Shell in der aktuellen Shell-Instanz ausführen, anstatt sie als Unterprozess auszuführen . Sie würden auf ein ähnliches Problem stoßen, wenn Sie andere Dinge tun wollten, die den Shell-Prozess selbst betreffen, wie z. B. das Wechseln von Verzeichnissen, das Setzen von Variablen usw. Verwenden Sie den .
(„Punkt“) oder source
eingebaut, um ein Skript im aktuellen Shell-Prozess auszuführen.
. idelhistory 300 365
Alternativ könnten Sie dies als Funktion in Ihrer .bashrc
definieren .