Bash History: Befehle wiederfinden, bearbeiten und erneut verwenden

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:

BestandteilBedeutung
History-ListeDer Befehlsverlauf im Speicher der laufenden Shell
History-DateiDer 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:

  1. Den Befehl mit der Pfeiltaste zurückholen.
  2. /etc durch /var ersetzen.
  3. Die Zeile prüfen.
  4. 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:

  1. Strg + R drücken.
  2. Einen Teil des gesuchten Befehls eingeben, beispielsweise nano.
  3. Bash zeigt einen passenden früheren Aufruf.
  4. Erneut Strg + R drü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:

EingabeBedeutung
!!Den letzten Befehl wiederholen
!201Den History-Eintrag mit der Nummer 201 verwenden
!nanoDen 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:

EinstellungBedeutung
HISTSIZEAnzahl der Einträge in der History-Liste im Speicher
HISTFILESIZEGrößenbegrenzung der History-Datei in Zeilen
histappendBeim 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:

  1. Strg + O
  2. Enter
  3. Strg + X zum 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.


,
Fediverse reactions
Andreas Moor
Andreas Moor
@blog@andreas-moor.de

Hallo Fediverse, ich bin Andy!

Hier und auf meiner Website findest du mein akkumuliertes Linux-Sysadmin-Wissen, meine kleinen und größeren Projekte und die Tools, die ich nutze.

Viel Spaß beim stöbern, lesen und lernen! 🧑‍💻

58 Beiträge
39 Folgende