GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Warum funktioniert dieses Skript zum Löschen eines Teils des Befehlsverlaufs nicht auf dem Computer?

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.

Siehe auch:Dual Boot mit UEFI und LUKS – Was muss ich wissen/tun?

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 .


Ubuntu
  1. Das Ausrufezeichen (!) In Bash verstehen?

  2. Warum tötet der folgende Befehl ein System?

  3. Warum ist Firefox 8.0 nicht als Update im Update Manager verfügbar?

  4. Im Befehlsverlauf scheinen die ersten 75 Zeilen zu fehlen?

  5. Warum wird die native Auflösung des Monitors nicht als Option angezeigt?

So verwenden Sie den Linux-Verlaufsbefehl

So zeigen und löschen Sie den Terminalverlauf in Ubuntu 20.04

So verwenden Sie den Verlaufsbefehl unter CentOS 8

Finden Sie den geografischen Standort des Ubuntu-Servers über die Befehlszeile

Warum wird „Boot-Repair“ zweimal in der Ubuntu-Dokumentation aufgeführt?

Warum verhält sich Ping -f so?