Login
Newsletter
Do, 30. November 2017, 15:05

Bash: Eigene Historie für jede Instanz

Man kann jeder Shell ihre eigene Kommando-Historie zuweisen. Das zu automatisieren, ist aber nicht so einfach. Hier wird eine Möglichkeit gezeigt, das zu erreichen.

Wer oft eine Shell oder Konsole mit darin laufender Shell nutzt, verwendet sicher auch oft die Kommando-Historie, um bereits einmal eingegebene Kommandos nochmals abzusetzen, gegebenenfalls nach vorheriger Änderung. Dabei ist es nützlich, dass die Shell diese Historie standardmäßig in einer Datei speichert. So steht die komplette Historie auch nach einem Neustart wieder zur Verfügung.

Wenn man jetzt aber zwei oder mehr Shells nutzt, verwenden sie dieselbe Datei. Das hat zur Folge, dass bei einem Neustart alle Shells dieselbe Historie haben, es aber vom Zufall abhängig ist, von welcher Shell die Historie stammt, die überlebt hat. Viel praktischer wäre es, wenn jede Shell ihre eigene Historie hätte und diese nach einem Neustart auch zuverlässig wieder erhielte. Eigentlich ist das ganz einfach: Man setzt die Variable HISTFILE vor dem Aufruf der Shell. Doch je nachdem, wo man die Shell startet, kann es unmöglich sein, Umgebungsvariablen mitzugeben. Daher wird hier ein anderer Mechanismus vorgestellt.

Alle folgenden Ausführungen beziehen sich auf die Bash. Andere Shells besitzen oft ähnliche Mechanismen, werden hier aber nicht explizit erwähnt.

Das Schlüsselproblem ist, dass man jeder Shell eine Datei mit festem Namen eindeutig zuweisen muss. Dafür benötigt jede Shell eine eindeutige Identifikation. Die gibt es aber nicht. Es gibt keine interne Nummerierung und die Prozess-ID kann bei jedem Start eine andere sein. Die Lösung ist, jeder Shell beim Start ein Argument mitzugeben, das eindeutig ist. Das macht man natürlich nicht von Hand, sondern verankert es in seinen Startskripten. Wer einen grafischen Desktop einsetzt, kann den automatischen Start der Terminals in xinit-Dateien oder Autostart-Dateien des Desktops bzw. der Desktop-Sitzung hinterlegen. In einer sehr alten xinit-Datei hatte ich beispielsweise folgende Zeile:

rxvt -geometry 80x25+0+0 -T bash -e /bin/bash -login &

Wir konzentrieren uns im folgenden auf den Aufruf der Shell, der in obiger Zeile lediglich aus /bin/bash -login besteht. Wie bereits erwähnt, ist das Problem zu lösen, jeder Shell eine eindeutige Identifikation mitzugeben. Das geschieht durch ein simples Argument. Damit das Argument aber als solches erkannt wird und nicht als Name eines Skripts interpretiert wird, das auszuführen ist, ist die Option -s erforderlich:

bash -l -s work.1
bash -l -s work.2

Das -l in dem Aufruf ist die Abkürzung von -login und ist immer erforderlich, wenn man will, dass die Shell auch die profile-Dateien einliest.

Es ist natürlich möglich, als Parameter einfach eine fortlaufende Nummer oder beliebige Namen zu verwenden. Ich halte es für praktischer, eine Unterteilung in Workspaces vorzunehmen, so hat der Workspace auf dem ersten virtuellen Bildschirm den Namen Work, und die Shells innerhalb jedes Workspaces werden durchnummeriert.

Der zweite Schritt ist, den Parameter innerhalb der Shell zu verarbeiten. Dazu bietet sich die Datei ~/.bashrc an, die beim Start der Shell immer ausgeführt wird. In diese wird folgender Code eingefügt:

export HISTCONTROL=ignoredups
x=$(tr '\0' '\n' < /proc/$$/cmdline | tail -n 2 | head -n 1)
if [ "$x" = "-s" ]; then
    x=$(tr '\0' '\n' < /proc/$$/cmdline | tail -n 1)
    if [ -n "$x" -a "$x" = "${x/[a-z][a-z0-9]*.[1-9][0-9]*}" ]; then
        export HISTFILE=~/.bash_history.$x
    fi
fi
unset x
export HISTSIZE=1000

Der umständliche Code resultiert daraus, dass es sich als unmöglich herausgestellt hat (bei der Bash jedenfalls), auf den übergebenen Parameter mit $1 zuzugreifen. Das Resultat ist, dass der Parameter in die Variable x eingelesen wird und daraus der Name der History-Datei als ~/.bash_history.$x konstruiert wird. Die erste und die letzte Zeile sind nicht nötig und sollen nur zeigen, wie man das Verhalten der Historie zusätzlich konfigurieren kann.

Das Ergebnis der geringen Mühe ist eine (längst überfällige) Optimierung und Erleichterung der Arbeit.

  • Das Werk darf vervielfältigt, verbreitet und öffentlich zugänglich gemacht werden, Abwandlungen und Bearbeitungen des Werkes müssen unter den gleichen Bedingungen weitergegeben werden. Der Name des Autors/Rechteinhabers muss in der von ihm festgelegten Weise genannt werden.

    - Weitere Informationen
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten