How To Forge .. kennt Ihr bestimmt. Ist so eine Webseite, wo Leute anderen Leuten zeigen, wie Dinge funktionieren. I.d.R. sind das spannende Sachen, wie man Webserver aufsetzt z.B. . Es gibt aber auch Dinge, die nur eine Zeile lang sind, so wie der Artikel hier: https://www.howtoforge.com/clear-bash-history/
Um was geht es überhaupt
„Das Löschen des BASH Kommandoarchives.“
Jeder der schon mal eine Bash-Shellkonsole benutzt hat, dürfte über die Bash-History gestolpert sein, als er ab- und unabsichtlich die Cursorsteuertasten benutzt hat. Damit kann man den vorherigen Befehl nochmal sichtbar machen, Fehler beheben und wieder abschicken. Spart eine ganze Menge Tipparbeit.
Das lief dann auf … hinaus
Der Artikel lief dann auf diesen Einzeiler hinaus:
cat /dev/null > ~/.bash_history && history -c && exit
Und so schlicht das auch aussieht, da steckt doch glatt ein „Schönheitsfehler“ drin. Naja, ok, Fehler ist zu viel gesagt, ich würde es anders machen :
echo „“ > ~/.bash_history && history -c && exit
Bevor sich jemand zu Kommentarflames genötigt sieht, die eh gelöscht werden, was jetzt kommt ist rein akademisch.
Warum ?
Wir wollen die Datei leer haben, aber in einem definierten Zustand. Das Spezial-Device /dev/null erzeugt .. nichts.. Das ist aber weniger als „leer“ 🙂 Der Ansatz mit /dev/null funktioniert natürlich, weil cat solange was ausgibt, bis nichts mehr kommt und das passiert natürlich sofort. Also steht am Ende nichts mehr in der Datei, weil mit „>“ alles übergenagelt wird, was schon drin war.
Ich persönlich, finde ‚echo „“ >‘ als Konstrukt schöner, weil eindeutiger formuliert.
echo „“ zeigt deutlich, daß wir keinen Inhalt haben wollen. Bei /dev/null ergibt sich das nur indirekt aus dem Verhalten von cat und dem Verhalten von /dev/null . Beides muß man kennen um es zu verstehen. echo „“ sagt auch einem unbedarften Leser, daß es hier um „keinen Inhalt“ geht.
Wem das jetzt zu pingelig war, hat wohl noch nie versucht fremden Programmcode zu entziffern. Da spielt die eindeutige Benennung der Methode/Funktion eine wichtige Rolle, wenn der Code schon nicht Kommentiert ist. Das gleiche Prinzip gilt auch für Bashbefehle.
Soweit zu Teil 1.. jetzt reduzieren wir das mal brutalst auf 2 Befehle 🙂
echo „“ > ~/.bash_history; killall -9 bash
Was passiert hier ?
Zunächst mal machen wir die History platt, genau wie vorher. Jetzt killen wir alle Bash Shells die laufen, was in der Regel nur die eine sein wird. Shells von Root und anderen Benutzern können wir so nicht beenden, außer wir sind root. Da die Bash hart beendet wird, kann sie Ihre History nicht mehr auf Platte schreiben, womit die Datei auch nach dem Logout noch leer ist, welcher implizit beim Killen der Bashshell passiert. Ziel erreicht, ein Befehl weniger 😀
Zu Ursachen und Nebenwirkungen, fragen Sie Ihren Arzt und Drogendealer
Keine Frage, die Methode kann Kollateralschäden in anderen Bashsessions des Users verursachen. Sie ist auch um keinen Deut „besser“ als die ursprünglich vorgestellte Methode, nur kürzer. Und nur darum ging es heute.