Im vorherigen Beitrag ging es um Aliase: persönliche Kurzbefehle für häufig wiederkehrende Aufgaben. Doch nicht jeder nützliche Befehl braucht sofort einen eigenen Namen. Oft genügt es, einen bereits verwendeten Aufruf wiederzufinden und anzupassen.
Genau dafür gibt es die History. Bash führt einen Befehlsverlauf, auf den du während der Arbeit zurückgreifen kannst. So musst du längere Eingaben nicht jedes Mal neu schreiben. Außerdem lässt sich steuern, wie viele Einträge aufbewahrt werden und welche Befehle überhaupt in den Verlauf gelangen.
Was speichert die Bash History?
Die History enthält zuvor eingegebene Befehlszeilen. Sie ist keine vollständige Aufzeichnung der Terminalsitzung: Programmausgaben und Fehlermeldungen werden dadurch nicht automatisch mitgespeichert.
Dabei unterscheidet Bash zwischen zwei Dingen:
| Bestandteil | Bedeutung |
|---|---|
| History-Liste | Der Befehlsverlauf im Speicher der laufenden Shell |
| History-Datei | Der dauerhaft gespeicherte Verlauf, normalerweise ~/.bash_history |
Beim Start liest Bash vorhandene Einträge aus der History-Datei ein. Beim regulären Beenden schreibt sie den Verlauf entsprechend ihrer Konfiguration zurück. Manche Systeme ergänzen weitere Mechanismen, um Einträge bereits während der Sitzung zu speichern.
Wichtig ist deshalb: Eine gerade eingegebene Befehlszeile muss noch nicht in ~/.bash_history stehen.
Mit den Pfeiltasten durch alte Befehle gehen
Die einfachste Nutzung kennst du möglicherweise bereits:
- Pfeil nach oben: einen früheren Befehl aufrufen.
- Pfeil nach unten: wieder in Richtung neuerer Eingaben wechseln.
Der aufgerufene Befehl erscheint zunächst in der Eingabezeile. Du kannst ihn bearbeiten und erst danach mit Enter ausführen. Bash verwendet dafür ihre interaktive Zeilenbearbeitung mit Readline.
Angenommen, du hast zuvor eingegeben:
ls -lh /etc
Nun möchtest du stattdessen /var betrachten:
- Den Befehl mit der Pfeiltaste zurückholen.
/etcdurch/varersetzen.- Die Zeile prüfen.
- Mit Enter ausführen.
Der Vorteil: Du verwendest einen bekannten Aufbau erneut, ohne den gesamten Befehl neu zu schreiben.
Den Verlauf mit history anzeigen
Mit dem eingebauten Bash-Befehl:
history
wird die aktuelle History-Liste mit Eintragsnummern ausgegeben.
Eine beispielhafte Ausgabe könnte so aussehen:
201 ls -lh /etc
202 man ls
203 nano ~/.bash_aliases
204 history
Die Nummern sind keine Prozessnummern. Sie kennzeichnen die Einträge im aktuellen Verlauf.
Wenn du nur die letzten zehn Einträge sehen möchtest:
history 10
Die Zahl begrenzt hier die Ausgabe. Sie verändert nicht die eingestellte Größe des Verlaufs.
3. Mit Strg + R gezielt suchen
Bei einem längeren Verlauf ist das Durchblättern umständlich. Mit der üblichen Emacs-Tastenbelegung von Readline startet Strg + R eine rückwärtsgerichtete Suche.
Emacs ist neben Vi/Vim und Nano einer der gängigen Texteditoren im Linux/Unix-Umfeld.
So funktioniert es:
Strg+Rdrücken.- Einen Teil des gesuchten Befehls eingeben, beispielsweise
nano. - Bash zeigt einen passenden früheren Aufruf.
- Erneut
Strg+Rdrücken, um einen älteren Treffer zu finden.
Die Anzeige kann beispielsweise so aussehen:
(reverse-i-search)`nano': nano ~/.bash_aliases
Du musst nicht den Anfang des Befehls kennen. Die Suche kann auch einen Textteil innerhalb der Zeile finden.
Den Treffer vor der Ausführung prüfen
Mit Esc lässt sich die Suche beenden und der gefundene Befehl zur Bearbeitung übernehmen. Erst danach führst du ihn mit Enter aus.
Mit Strg + G brichst du die Suche ab und kehrst zur ursprünglichen Eingabezeile zurück.
Gerade bei Befehlen, die Dateien verändern oder administrative Aktionen ausführen, ist dieses bewusste Prüfen sinnvoll.
Frühere Befehle mit ! erneut aufrufen
Bash besitzt außerdem eine History-Erweiterung mit dem Ausrufezeichen. Damit können frühere Eingaben direkt in eine neue Befehlszeile übernommen werden. In interaktiver Bash ist diese Funktion normalerweise aktiviert.
Typische Schreibweisen sind:
| Eingabe | Bedeutung |
|---|---|
!! | Den letzten Befehl wiederholen |
!201 | Den History-Eintrag mit der Nummer 201 verwenden |
!nano | Den jüngsten Befehl verwenden, der mit nano beginnt |
Diese Formen gehören zur History-Erweiterung von Bash.
Dabei ist Vorsicht angebracht: Nach Enter kann der ersetzte Befehl unmittelbar ausgeführt werden. !nano bedeutet nicht „nach passenden Befehlen suchen und einen auswählen“.
Für den Einstieg sind die Pfeiltasten oder Strg + R deshalb leichter kontrollierbar.
Eine zusätzliche Prüfung einschalten
Mit:
shopt -s histverify
werden History-Erweiterungen bei verwendeter Readline-Zeilenbearbeitung zunächst wieder in die Eingabezeile übernommen. Du kannst das Ergebnis vor der Ausführung prüfen und bearbeiten.
Diese Einstellung kann später ebenfalls in die persönliche .bashrc aufgenommen werden.
Wo liegt die History-Datei?
Den aktuell verwendeten Dateipfad zeigt:
echo "$HISTFILE"
Normalerweise ist das eine Datei wie:
/home/andreas/.bash_history
Der tatsächliche Pfad hängt von Benutzerkonto und Konfiguration ab.
Für die tägliche Arbeit ist history meist sinnvoller als das direkte Bearbeiten dieser Datei. Die laufende Shell besitzt schließlich ihre eigene Liste, die von der gespeicherten Datei abweichen kann.
Wer die Datei im Editor verändert, während noch andere Bash-Sitzungen laufen, muss damit rechnen, dass diese später weitere oder zuvor geladene Einträge zurückschreiben.
Die Größe und das Verhalten konfigurieren
Die History lässt sich über Variablen und Shell-Optionen anpassen.
Drei wichtige Einstellungen sind:
| Einstellung | Bedeutung |
|---|---|
HISTSIZE | Anzahl der Einträge in der History-Liste im Speicher |
HISTFILESIZE | Größenbegrenzung der History-Datei in Zeilen |
histappend | Beim Beenden neue Einträge anhängen statt die Datei zu überschreiben |
Die Unterscheidung zwischen Einträgen und Zeilen ist relevant, weil ein Befehl aus mehreren Zeilen bestehen kann.
Die .bashrc mit nano bearbeiten
Öffne die Datei:
nano ~/.bashrc
Suche zunächst nach vorhandenen History-Einstellungen. Wenn sie bereits existieren, passe sie möglichst dort an, statt mehrere widersprüchliche Definitionen zu verteilen.
Eine überschaubare Konfiguration könnte so aussehen:
# History-Größe
HISTSIZE=5000
HISTFILESIZE=10000
# Direkt aufeinanderfolgende identische Eingaben auslassen
HISTCONTROL=ignoredups
# Neue History-Einträge anhängen
shopt -s histappend
# History-Erweiterungen vor der Ausführung prüfen
shopt -s histverify
ignoredups unterdrückt nur einen Eintrag, der mit dem unmittelbar vorherigen übereinstimmt. Es entfernt nicht sämtliche älteren Wiederholungen aus dem Verlauf.
Speichere in nano mit:
Strg+O- Enter
Strg+Xzum Beenden.
Anschließend kannst du die Konfiguration neu einlesen:
source ~/.bashrc
Die Einstellungen gelten damit für die aktuelle Shell und künftig für neue interaktive Bash-Sitzungen, die diese Datei laden. Bereits geöffnete andere Shells ändern ihre Einstellungen dadurch nicht automatisch.
Mehrere Terminals: Warum der Verlauf unterschiedlich sein kann
Jede Bash-Sitzung besitzt zunächst eine eigene History-Liste. Wenn zwei Terminalfenster geöffnet sind, sehen sie daher nicht zwangsläufig sofort dieselben neuen Befehle.
histappend verhindert, dass beim regulären Beenden einfach die gesamte Datei durch die Liste einer Sitzung ersetzt wird. Es sorgt jedoch nicht allein für eine sofortige Synchronisation aller offenen Fenster.
Für einen manuellen Austausch gibt es:
history -a
Dieser Befehl hängt die noch nicht gespeicherten neuen Einträge der aktuellen Sitzung an die History-Datei an.
history -n
liest neue, bislang nicht eingelesene Einträge aus der Datei in die aktuelle History-Liste.
Eine typische Reihenfolge ist:
history -a
history -n
Damit werden zunächst eigene neue Einträge gespeichert und anschließend neue Dateieinträge eingelesen. Das ist für den Einstieg leichter nachvollziehbar als eine versteckte automatische Synchronisation bei jeder Eingabeaufforderung.
Einzelne Einträge entfernen
Mit:
history
findest du die Nummer eines Eintrags. Anschließend kann er aus der aktuellen Liste entfernt werden:
history -d 201
Die Zahl muss durch die tatsächlich angezeigte Eintragsnummer ersetzt werden.
Die Änderung betrifft zunächst die Liste im Speicher. Mit:
history -w
wird die aktuelle Liste in die History-Datei geschrieben und deren bisheriger Inhalt überschrieben.
Das sollte bei mehreren offenen Shells bewusst geschehen: Noch nicht eingelesene Einträge anderer Sitzungen könnten dadurch aus der Datei verschwinden. Umgekehrt können andere Sitzungen später wieder Einträge hineinschreiben.
Auch:
history -c
leert zunächst nur die aktuelle History-Liste. Es ist nicht gleichbedeutend mit „alle gespeicherten Verläufe überall sicher löschen“.
Passwörter und Tokens gehören nicht in Befehlszeilen
Die History speichert Befehlszeilen. Wenn ein Passwort, Zugangstoken oder anderer geheimer Wert direkt darin steht, kann dieser dadurch dauerhaft im Verlauf landen.
Einige Benutzer konfigurieren deshalb:
HISTCONTROL=ignoreboth
Das kombiniert:
ignoredups: unmittelbar aufeinanderfolgende identische Eingaben auslassen,ignorespace: Eingaben mit führendem Leerzeichen nicht in die History-Liste aufnehmen.
Das führende Leerzeichen funktioniert aber nur, wenn diese Einstellung tatsächlich aktiv ist. Es ist außerdem kein allgemeiner Geheimnisschutz: Andere Aufzeichnungen oder die Eigenschaften des gestarteten Programms werden dadurch nicht beeinflusst.
Der bessere Grundsatz lautet: Geheimnisse nach Möglichkeit über die dafür vorgesehene Passwortabfrage oder einen geeigneten Geheimnismechanismus des jeweiligen Programms eingeben – nicht als sichtbaren Bestandteil einer Befehlszeile.
Wurde ein Zugangstoken versehentlich offengelegt, macht das Entfernen eines History-Eintrags diese Offenlegung nicht rückgängig.
Hilfe zur History nachschlagen
Passend zum vorherigen Beitrag über Linux-Hilfesysteme kannst du die eingebaute Dokumentation direkt aufrufen:
help history
Dort findest du die Optionen zum Anzeigen, Speichern, Einlesen und Löschen von History-Einträgen. Für die ausführlicheren Zusammenhänge bietet das Bash-Handbuch eigene Kapitel zur History und ihrer Erweiterung.
Fazit: Wiederfinden statt neu tippen
Die Bash History macht bereits verwendete Befehle erneut zugänglich. Für den Alltag reichen zunächst drei Werkzeuge: die Pfeiltasten, history und die Suche mit Strg + R.
Mit einer bewusst gewählten Konfiguration bleibt der Verlauf auch über Sitzungen hinweg nützlich. Dabei hilft die klare Trennung zwischen der Liste im Speicher und der gespeicherten Datei. Die History ist eine Arbeitserleichterung – aber weder ein vollständiges Arbeitsprotokoll noch ein sicherer Aufbewahrungsort für Geheimnisse.
