Under Construction

Kontrollieren welche Kommandos der History hinzugefügt werden

Mit der bash kann konfiguriert werden, welche Kommandos in die History Liste aufgenommen werden sollen und welche nicht. Hierfür gibt es die beiden bash Variablen HISTCONTROL und HISTIGNORE. Im Folgenden sollen kurz die Möglichkeiten für beide Variablen vorgestellt werden.

Häufig wird ein und das gleiche Kommando mehrere Male hintereinander ausgeführt, wie z.B.:

[user01@aixe01 ~]$ date
Fri Apr 29 20:18:52 CEST 2022
[user01@aixe01 ~]$ date
Fri Apr 29 20:18:57 CEST 2022
[user01@aixe01 ~]$

Standardmäßig werden alle Kommandos in die History Liste aufgenommen, was dazu führt das im obigen Fall das gleiche Kommando zweimal hintereinander in der History auftaucht:

[user01@aixe01 ~]$ history
    1  ls -l
    2  ls -l
    3  hostname
    4  df /
    5  pwd
    6  date
    7  date
    8  history
[user01@aixe01 ~]$

Durch Setzen der Variablen HISTCONTROL auf den Wert ignoredups, werden mehrfach direkt hintereinander ausgeführte identische Kommandos nur einmal der History Liste hinzugefügt:

[user01@aixe01 ~]$ HISTCONTROL=ignoredups
[user01@aixe01 ~]$

Führt man nun das Kommando date, wie oben, zweimal direkt hintereinander aus:

[user01@aixe01 ~]$ date
Fri Apr 29 20:30:03 CEST 2022
[user01@aixe01 ~]$ date
Fri Apr 29 20:30:05 CEST 2022
[user01@aixe01 ~]$

so wird das Kommando date nur einmal in der History festgehalten:

[user01@aixe01 ~]$ history
    1  ls -l
    2  ls -l
    3  hostname
    4  df /
    5  pwd
    6  date
    7  date
    8  history
    9  HISTCONTROL=ignoredups
   10  date
   11  history
[user01@aixe01 ~]$

Nach Setzen von HISTCONTROL wurde date nur einmal als Kommando mit der Nummer 10 in der History Liste festgehalten. Die beiden vorigen Vorkommen von date (Kommando 6 und Kommando 7) bleiben aber in der History Liste stehen.

In der History Liste oben, taucht das Kommando date insgesamt dreimal auf, das Kommando history zweimal. Möchte man das ein Kommando insgesamt nur einmal in der History Liste festgehalten wird, so kann man die Variable HISTCONTROL auf den Wert erasedups setzen:

[user01@aixe01 ~]$ HISTCONTROL=erasedups
[user01@aixe01 ~]$   

Wird ein Kommando der History Liste hinzugefügt, dann werden frühere Vorkommen dieses Kommandos entfernt. Wir führen das Kommando date erneut zweimal direkt hintereinander aus:

[user01@aixe01 ~]$ date
Fri Apr 29 20:33:44 CEST 2022
[user01@aixe01 ~]$ date
Fri Apr 29 20:33:46 CEST 2022
[user01@aixe01 ~]$

Auflisten der History Liste zeigt, das das date Kommando jetzt nur noch insgesamt einmal vorkommt:

[user01@aixe01 ~]$ history
    1  ls -l
    2  ls -l
    3  hostname
    4  df /
    5  pwd
    6  HISTCONTROL=ignoredups
    7  HISTCONTROL=erasedups
    8  date
    9  history
[user01@eaixe01 ~]$

Auch die mehrfachen Vorkommen des Kommandos history wurden entfernt und nur das letzte history Kommando findet sich in der History Liste wieder! Das Kommando „ls –l“ steht aber weiterhin zweimal am Anfang der History Liste. Die Duplikate werden erst beim Hinzufügen eines Kommandos zur History Liste entfernt! Wir starten einmal „ls –l“ und danach das Kommando history:

[user01@aixe01 ~]$ ls -l
total 29128
drwxr-xr-x    2 user01  staff         12288 Apr 29 14:01 bin/
drwxr-xr-x    2 user01  staff           256 Apr 29 10:59 etc/
...
-rw-r--r--    1 user01  staff            21 Apr 14 11:13 sample.txt
[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
[user01@aixe01 ~]$

Man sieht das die beiden Vorkommen von „ls –l“ am Anfang der History Liste entfernt wurden und das Kommando jetzt als vorletztes Kommando in der Liste steht.

Ob man erasedups oder ignoredups bevorzugt, ist natürlich sehr subjektiv. Das muss jeder Benutzer letztlich selber entscheiden. Wir bevorzugen die Einstellung ignoredups.

Die Variable HISTCONTROL erlaubt noch einen dritten Wert und zwar ignorespace. Diese Einstellung gibt dem Benutzer bei jedem einzelnen Kommando die Kontrolle darüber, ob das Kommando in die History Liste aufgenommen werden soll, oder nicht. Wir setzen zunächst den Wert von HISTCONTROL auf ignorespace:

[user01@aixe01 ~]$ HISTCONTROL=ignorespace
[user01@aixe01 ~]$

Wird vor einem Kommando ein Leerzeichen eingegeben, dann wird das Kommando nicht in die History Liste aufgenommen. Wird kein Leerzeichen vorangestellt, wird das Kommando wie gehabt in die History Liste aufgenommen. Wir starten zunächst das Kommando date, ohne vorangestelltes Leerzeichen und danach das Kommando hostname mit einem oder mehreren Leerzeichen vor dem Kommando:

[user01@aixe01 ~]$ date
Fri Apr 29 20:50:55 CEST 2022
[user01@aixe01 ~]$    hostname
aixe01
[user01@aixe01 ~]$

Ausgeben der History Liste zeigt, das das Kommando hostname nicht in die History Liste aufgenommen wurde, im Gegensatz zum Kommando date:

[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
    9  HISTCONTROL=ignorespace
   10  date
   11  history
[user01@aixe01 ~]$

Möchte man ignoredups (von oben) und ignorespace zusammen verwenden, kann man beide Werte durch einen Doppelpunkt „:“ voneinander getrennt angeben:

[user01@aixe01 ~]$ HISTCONTROL=ignoredups:ignorespace
[user01@aixe01 ~]$


Wir starten wieder zweimal date (ohne führendes Leerzeichen) und einmal hostname mit führenden Leerzeichen:

[user01@aixe01 ~]$ date
Fri Apr 29 20:58:32 CEST 2022
[user01@aixe01 ~]$ date
Fri Apr 29 20:58:34 CEST 2022
[user01@aixe01 ~]$    hostname
aixe01
[user01@aixe01 ~]$

Dies hat den gewünschten Effekt:

[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
    9  HISTCONTROL=ignorespace
   10  date
   11  history
   12  HISTCONTROL=ignoredups:ignorespace
   13  date
   14  history
[user01@aixe01 ~]$

Hinweis: Anstelle von „ignoredups:ignorespace“ kann man auch „ignoreboth“ verwenden!

Hinweis: Möchte man erasedups mit ignorespace kombinieren, gibt es keine Abkürzung. Man muss dann beide Werte mit Doppelpunkt „:“ getrennt angeben, z.B. „erasedups:ignorespace“.

Wir tragen unseren Favoriten „ignoreboth“ in die Start-Datei ~/.bashrc ein:

[user01@aixe01 ~]$ cat ~/.bashrc

HISTCONTROL=ignoreboth

[user01@aixe01 ~]$

Eine weitere Möglichkeit zu kontrollieren, welche Kommandos in die History Liste aufgenommen werden, besteht über die Variable HISTIGNORE. Als Wert kann eine durch Doppelpunkte getrennte Liste von Pattern angegeben werden. Passt ein eingegebenes Kommando auf eines der Pattern, dann wird es nicht in die History Liste aufgenommen. Ein Patttern muss dabei die komplette Kommandozeile matchen.

Wir demonstrieren dies am Beispiel des Kommandos history. Wir möchten nicht das dieses in die History Liste aufgenommen wird:

[user01@aixe01 ~]$ HISTIGNORE=history
[user01@aixe01 ~]$

Wir starten zunächst wieder ein date Kommando:

[user01@aixe01 ~]$ date
Fri Apr 29 21:11:03 CEST 2022
[user01@aixe01 ~]$

Dann geben wird die History Liste mit dem Kommando history aus. Das Kommando history sollte jetzt nicht mehr am Ende der History Liste auftauchen:

[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
    9  HISTCONTROL=ignorespace
   10  date
   11  history
   12  HISTCONTROL=ignoreboth
   13  date
   14  history
   15  HISTIGNORE=history
   16  date
[user01@aixe01 ~]$

Wie erwartet ist date das letzte Kommando in der History Liste! Gibt man allerdings history gefolgt von einem Leerzeichen an:

[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
    9  HISTCONTROL=ignorespace
   10  date
   11  history
   12  HISTCONTROL=ignoreboth
   13  date
   14  history
   15  HISTIGNORE=history
   16  date
   17  history
[user01@aixe01 ~]$

dann wird history wieder als letztes Kommando aufgeführt. Das liegt daran das immer die gesamte Kommandozeile, hier einschließlich des Leerzeichens am Ende, auf das oder die Pattern matchen muss. Man könnte als Pattern „history*“ verwenden, was history gefolgt von keinem, einem oder mehreren beliebigen Zeichen von der History Liste ausschließen würde:

[user01@aixe01 ~]$ HISTIGNORE='history*'
[user01@aixe01 ~]$

Gibt man erneut history gefolgt von einem Leerzeichen ein:

[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
    9  HISTCONTROL=ignorespace
   10  date
   11  history
   12  HISTCONTROL=ignoreboth
   13  date
   14  history
   15  HISTIGNORE=history
   16  date
   17  history
   18  HISTIGNORE='history*'
[user01@aixe01 ~]$

wird history dieses Mal nicht ans Ende der History Liste angefügt.

Sollte es ein Kommando geben, das mit history anfängt, z.B. „historyNew“:

[user01@aixe01 ~]$ echo "echo new history" >historyNew
[user01@aixe01 ~]$ chmod a+x historyNew
[user01@aixe01 ~]$

Dann wird die Ausführung dieses Kommandos nicht in die History Liste eingetragen:

[user01@aixe01 ~]$ historyNew
new history
[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
    9  HISTCONTROL=ignorespace
   10  date
   11  history
   12  HISTCONTROL=ignoreboth
   13  date
   14  history
   15  HISTIGNORE=history
   16  date
   17  history
   18  HISTIGNORE='history*'
   19  echo "echo new history" >historyNew
   20  chmod a+x historyNew
[user01@aixe01 ~]$

Wir ändern daher die Variable HISTIGNORE wie folgt ab:

[user01@aixe01 ~]$ HISTIGNORE='history:history *'
[user01@aixe01 ~]$

Wird jetzt das Kommando history (ohne Leerzeichen am Ende) oder history gefolgt von einem Leerzeichen und dann keinem, einem oder mehreren beliebigen Zeichen eingegeben, dann wird dies nicht in der History Liste festgehalten. Allerdings matcht jetzt historyNew nicht mehr und wird korrekt in die History Liste aufgenommen:

[user01@aixe01 ~]$ historyNew
new history
[user01@aixe01 ~]$ history
    1  hostname
    2  df /
    3  pwd
    4  HISTCONTROL=ignoredups
    5  HISTCONTROL=erasedups
    6  date
    7  ls -l
    8  history
    9  HISTCONTROL=ignorespace
   10  date
   11  history
   12  HISTCONTROL=ignoreboth
   13  date
   14  history
   15  HISTIGNORE=history
   16  date
   17  history
   18  HISTIGNORE='history*'
   19  echo "echo new history" >historyNew
   20  chmod a+x historyNew
   21  HISTIGNORE='history:history *'
   22  historyNew
[user01@aixe01 ~]$

Damit kann für beliebige Kommandos verhindert werden, das diese in die History Liste aufgenommen werden.

Die auszuschließenden Pattern sollten wieder über eine der Start-Dateien der bash konfiguriert werden. Wie gehabt, verwenden wir ~/.bashrc:

[user01@aixe01 ~]$ cat ~/.bashrc

HISTIGNORE='history:history *'

[user01@aixe01 ~]$

Bei der Überprüfung ob ein Kommando in die History Liste aufgenommen werden soll, wird zuerst die Variable HISTCONTROL verwendet, danach erst werden die Pattern aus HISTIGNORE überprüft.