Bash und Zsh gelten heute im Linux- und BSD-Umfeld als die beiden Standard-Shells. Zwar haben sie einiges gemeinsam, es gibt aber auch deutliche Unterschiede.
Sowohl die Bourne Again Shell Bash als auch die Z-Shell Zsh ermöglichen ein komfortables Arbeiten und weisen in der allgemeinen Bedienung viele Gemeinsamkeiten auf. So blättern Sie bei beiden mit den Pfeiltasten in der Befehlshistorie und können Befehle und Dateinamen mit der Tabulatortaste vervollständigen. Sowohl für die Bash [1] als auch die Zsh [2] stehen ausführliche Handbücher zur Verfügung.
Beide Befehlszeilenschnittstellen eignen sich auch als Login-Shell. Welche das System bei der Anmeldung verwendet, legt der dem Benutzer zugeordnete Eintrag in der Datei /etc/passwd fest. Er enthält neben dem Heimatverzeichnis des Benutzers auch die Login-Shell. Listing 1 zeigt ein Beispiel für den Benutzer bash_user).
Listing 1
Eintrag in /etc/passwd
bash_user:x:1002:1002::/home/bash_user:/bin/bash
Die Konfigurationsdateien der jeweiligen Shell befinden sich systemweit unter /etc sowie als sogenannte Dotfiles im Heimatverzeichnis des Benutzers. Die Einträge im Benutzerverzeichnis haben Vorrang vor den systemweiten Einstellungen. Es macht hinsichtlich der Konfigurationseinträge einen Unterschied, ob die Shell bei der Anmeldung startet (Login-Shell) oder manuell während einer Sitzung aufgerufen wird. Viele Shells nutzen allerdings die Dateien /etc/profile (systemweit) und ~/.profile (benutzerspezifisch). So kann man Anweisungen auch für verschiedene Shells hinterlegen.
Erweiterungen für die Zsh
Für die Zsh gibt es verschiedene Erweiterungen, wie oh-my-zsh, um die Shell mit noch mehr Komfort aufzuwerten. Diese zu beschreiben würde allerdings den Rahmen des Shell-Vergleichs sprengen.
Z-Shell konfigurieren
Während nach der erstmaligen Anmeldung oder dem manuellen Aufruf der Bash am Terminal nichts Weiteres geschieht, startet die Zsh ein Menü (Abbildung 1), in dem Sie einige Einstellungen vornehmen können, da die Datei .zshrc noch fehlt. In diesem Menü drücken Sie zunächst [1], um in das Hauptmenü (Abbildung 2) zu gelangen.
Dort arbeiten Sie nacheinander die Menüpunkte ab. In den einzelnen Unterpunkten sehen Sie neben den Einträgen die Warnung (not yet saved), falls diese geändert, aber noch nicht gespeichert wurden. Mit 0 springen Sie jeweils in das darüberliegende Menü zurück.
Drücken Sie im Hauptmenü zunächst wieder [1], um den Umfang der Historie festzulegen. Im Beispiel aus Abbildung 3 wurde sie auf 10 000 Zeilen erweitert.
Mit [2] gelangen Sie aus dem Hauptmenü zu den Einstellungen für die Autovervollständigung. Sie wählen hier zwischen dem Standardverhalten (1) oder mehr Komfort (2). Unter Punkt 3 im Hauptmenü legen Sie das Tastaturverhalten für das Bearbeiten von Kommandozeilen fest. Hier belassen Sie am besten den vorgeschlagenen Wert. Unter Punkt 4 bestimmen Sie das weitere Verhalten der Shell (Abbildung 4).
Jeweils mit [0]+ geht es aus den einzelnen Punkten wieder zurück ins Hauptmenü, wo Sie mit einem erneuten Druck auf [0] die Einstellungen speichern und damit die Vorarbeiten beenden. Bei der nächsten Anmeldung greifen dann die getroffenen Einstellungen.
Der Prompt fällt noch recht karg aus. Mit dem Befehl aus der ersten Zeile von Listing 2 laden Sie schon verfügbare Prompts. Davon gibt es bereits eine ganze Reihe, die prompt -l auflistet. Das Kommando prompt -p zeigt Ihnen ein Muster, prompt -s setzt den Eintrag. Der Befehl aus der zweiten Zeile von Listing 2 erleichtert die Auswahl: Er zaubert die Muster schier endlos auf das Terminal (Abbildung 5), wobei er ein- und zweizeilige Konstrukte anbietet.
Listing 2
Prompts laden
$ autoload -U promptinit && promptinit $ for i in $(prompt -l); do prompt -p $i; done
Die Zweizeiler haben den Vorteil, dass jeder Befehl und dessen Ausgabe optisch vom nächsten abgetrennt im Terminal erscheint – für Dokumentationszwecke optimal. Nach dem Setzen mit prompt -s Muster erscheint der Hinweis, dass Sie für ein dauerhaftes Ändern des Prompts das jeweilige Muster in der ~/.zshrc eintragen müssen. Der Eintrag besteht aus drei Zeilen (Listing 3).
Listing 3
Prompt ändern
autoload -Uz promptinit promptinit prompt Muster
Konfigurationsdateien
In vielen Quellen zur Shell-Konfiguration ist von der Datei .profile die Rede. Sie nimmt Einstellungen und Befehle auf, die die Shell bei der Anmeldung am System abarbeiten soll. Dies funktioniert so lange, wie keine Shell-eigene Profile-Datei vorhanden ist! Die weiteren Konfigurationsdateien zeigen Ihnen die Tabellen “Bash: Konfigurationsdateien” und “Zsh: Konfigurationsdateien”. Es werden nur die Dateien, die Sie im Benutzerverzeichnis finden (können) aufgelistet. Die systemweit gültigen finden Sie unter gleichem Namen ohne führenden Punkt unter /etc.
|
Datei |
Einträge/Hinweise |
|---|---|
|
|
Einstellungen und Befehle für den Start der Shell (Login und manueller Aufruf) |
|
|
Einstellungen und Befehle für das Login |
|
|
Befehle für das Abmelden von einer Sitzung |
|
Datei |
Einträge/Hinweise |
|---|---|
|
|
Einstellungen und Befehle für das Login |
|
|
Einstellungen, die unabhängig von der Aufrufart der Shell gelten |
|
|
Einstellungen und Befehle für den Start der Shell |
|
|
Befehle für das Login |
|
|
Befehle für das Abmelden von einer Sitzung |
Beim Login arbeitet die Bash zunächst die .bashrc und anschließend die .bash_profile ab. In Abbildung 6 sehen Sie ganz oben den Zustand nach der Anmeldung (.bashrc, .bash_profile). Dann erfolgt ein manueller Start der Bash (.bashrc). Beim Abmelden von der Sitzung arbeitet die Shell die Anweisungen aus der .bash_logout ab. Für die Demonstration wurde einfach ein entsprechender echo-Befehl eingefügt.
Die Z-Shell arbeitet beim Anmelden die Konfigurationsdateien in der Reihenfolge .zprofile, .zshrc und .zlogin ab. In der Datei .zshenv nehmen Sie Einstellungen vor, die für alle Aufrufarten gelten. Im Beispiel aus Abbildung 7 finden Sie die mit dem Wert 1 belegte Variable $wert. Beim manuellen Aufruf wertet die Zsh nur .zshrc und .zshenv aus, wie die Variablenausgabe dokumentiert. Beim Abmelden der Sitzung werden die Befehle aus .zlogout ausgeführt.
Bedeutung der Konfigurationsdateien
Neben dem Setzen von Variablen, Aliasen und so weiter ermöglichen die Konfigurationsdateien, beim An- und Abmelden Programme auszuführen. Das ermöglicht unter anderem, viele Aufgaben durch das Anlegen speziell darauf zugeschnittener Benutzerkonten zu erleichtern, zum Beispiel für die Datensicherung, für Stapeljobs in der Datenfernübertragung, für die Systemwartung und so weiter. Auf diesem Weg lassen sich zum Beispiel Aufgaben auch an EDV-Laien delegieren, weil sie sich dazu lediglich anmelden müssen. Ans Ende der jeweiligen Startdatei setzen Sie ein exit, um den Benutzer nach dem Erfüllen der Aufgabe automatisch abzumelden. Ein Beispiel, bei dem die Anmeldung des Benutzers platte automatisch die Belegung der Massenspeicher ausgibt, zeigt Abbildung 8. Für die Bash tragen Sie die fraglichen Befehle (df -h; exit; entweder in der Datei .bash_profile oder in .bashrc ein. Bei der Zsh können die Anweisungen sowohl in der Datei .zshrc als auch in .zlogin oder .zprofile stehen.
Beispiel für die Bash
Allgemein gültige Eintragungen nehmen Sie in der Datei .bashrc vor, sodass sie sowohl beim Login als auch beim manuellen Aufruf der Shell greifen.
Für den Prompt belegen Sie die Variable PS1. Dabei setzen Sie Farben und Schriftattribute durch Escape-Sequenzen, den Prompt-Inhalt durch entsprechende Platzhalter. Daneben besteht die Möglichkeit, in begrenztem Umfang sogar Shell-Befehle in einer Subshell unterzubringen, zum Beispiel pwd. Eine kompakte Übersicht über die Gestaltungsmöglichkeiten bietet zum Beispiel das Arch-Linux-Wiki [3]. Für erste Experimente fasst die Tabelle “Bash-Prompt” einige Informationen für den Einstieg zusammen, kann aber nur einen begrenzten Ausschnitt der vielfältigen Möglichkeiten darstellen.
|
Bedeutung |
Anweisung |
|---|---|
|
Rechnername ohne Domain |
|
|
Vollständiger Rechnername |
|
|
Benutzername |
|
|
Aktuelles Arbeitsverzeichnis |
|
|
Uhrzeit |
|
|
Lfd. Nummer in der History |
|
|
Lfd. Befehlsnummer (Sitzung) |
|
|
Textfarbe |
|
|
Schwarz |
|
|
Blau |
|
|
Rot |
|
|
Grün |
|
|
Gelb |
|
|
Weiß |
|
Sie haben viele Gestaltungsmöglichkeiten für den Prompt, vom minimalistischen Nichts bis zur vollen Zeile. Bemühen Sie sich aber immer um Übersichtlichkeit. So benötigen Sie Datum und Uhrzeit sowie die laufende Befehlsnummer etwa, um in Bildschirmabzügen wichtige Eingaben zu dokumentieren. In der täglichen Arbeit kann ein zu umfangreicher Prompt zudem zu Unübersichtlichkeit führen.
In unserem Beispiel soll der Prompt den Benutzer- und Rechnernamen sowie das aktuelle Arbeitsverzeichnis anzeigen. Die entsprechende Anweisung sowie deren Resultat sehen Sie in Abbildung 9. Zunächst erscheint das Arbeitsverzeichnis ärgerlicherweise schlecht lesbar in Hellgrau, sodass es gilt, zusätzlich die Farbeinstellung zu ändern. Wie die Abbildung zeigt, können Sie mittels direkter Eingabe experimentieren.
In der .bashrc befindet sich im Regelfall bereits eine Prompt-Definition. Sie ändern diese entsprechend ab oder setzen die Zeile aus Listing 4 an den Schluss der Datei, um den in Abbildung 9 gezeigten Prompt dauerhaft zu aktivieren.
Listing 4
Bash-Prompt
PS1='\[\033[01;32m\][\u@\h\[\033[00;34m\] \w\[\033[01;32m\]]\$\[\033[00m\] '
Häufig verfügt man über selbst erstellte Skripte und Programme, für die sich als Lagerort das Verzeichnis ~/bin eingebürgert hat. Erweitert man die Pfadvariable $PATH entsprechend, lassen sie sich ohne Pfadangabe aufrufen. Dafür sorgt folgender einfache Eintrag am Ende der Datei .bashrc:
PATH=$(echo $PATH:$HOME/bin)
Befehlsaliase ermöglichen die Definition eigener Kommandos oder das dauerhafte Verwenden von Optionen, die Sie sonst jedes Mal von Hand eingeben müssten. Als Beispiel soll Grep veranlasst werden, Fundstellen stets farbig hervorzuheben. In der .bashrc finden sich schon einige Aliase, unter die Sie einfach folgende Zeile setzen:
alias grep='grep --color'
Ab dem nächsten Anmelden oder Shell-Start erhalten Sie entsprechende Suchergebnisse mit farbigen Hervorhebungen.
Beispiel für die Zsh
Im Prinzip zwar weitgehend ähnlich, im Detail aber durchaus anders, setzen Sie Konfigurationseinträge in der .zshrc. So funktioniert das Setzen eines eigenen Prompts grundsätzlich wie bei der Bash, sogar die Escape-Sequenzen für die Farben sind dieselben [4]. Sie müssen Sie in der Zsh aber mittels \e einleiten. Die Platzhalter, mit denen Sie den Prompt-Inhalt aufbauen, unterscheiden sich dagegen völlig von denen für die Bash (siehe Tabelle “Zsh-Prompt”). Weitere Informationen dazu finden Sie im Zsh-Handbuch [2].
|
Bedeutung |
Anweisung |
|---|---|
|
Datum |
|
|
Zeit |
|
|
Rechnername ohne Domain |
|
|
Vollständiger Rechnername |
|
|
Benutzerkennung |
|
|
Exit-Code des letzten Kommandos |
|
|
Aktuelles Verzeichnis |
|
|
Aktuelles Verzeichnis (kürzt die Angabe des Heimatverzeichnisses) |
|
|
Lfd. Nummer in der History |
|
Um in der Zsh denselben Prompt wie in Abbildung 9 zu erhalten, verwenden Sie die Anweisung aus Listing 5. Die Anweisung \e[0m setzt dabei die Farbe auf die Grundeinstellung des Terminals zurück.
Listing 5
Zsh-Prompt
PS1=$'\e[0;32m%n@%m \e[0;34m%~\e[0m $ '
Variablen und Aliase tragen Sie in die Datei .zshenv ein. Auf dem Testsystem wurden die üblichen Farben für Verzeichnisse, ausführbare Dateien und so weiter beim Ls-Befehl nicht ausgegeben, was sich durch folgende Zeile korrigieren ließ:
alias ls="ls --color"
Das Anlegen weiterer Variablen und die Erweiterung von $PATH funktionieren wie bei der Bash und werden in .zshenv eingetragen.
History
Beide Shells speichern eine vorher definierte Anzahl von Kommandos in der History. Die Bash legt diese in .bash_history ab, die Zsh in .histfile. Beide Dateien lassen sich mit gängigen Textwerkzeugen betrachten und bei Bedarf ändern. So könnten Sie für bestimmte Szenarien komplexe Kommandos in einer Textdatei ablegen und die aktuelle History damit überschreiben.
Mit den Pfeiltasten navigieren Sie in der Historie. Das reine Auflisten erledigt der Befehl history beziehungsweise fc -l. Kennen Sie die Zeilennummer, können Sie den Befehl auch in der Form !Zeile aufrufen und erneut ausführen. Wurden Kennwörter als Kommandobestandteil verwendet, löschen Sie diese Zeilen am besten mit dem Editor Ihrer Wahl.
Variablen
Das Belegen einer Variablen in der Form Variable=Wert funktioniert bei beiden Shells gleich. Bei den Benutzereingaben und den Ausgaben gibt es Unterschiede (Tabelle “Unterschiede bei der Ein- und Ausgabe”), vom Befehl echo einmal abgesehen. Mit dem Kommando read (Bash) beziehungsweise vared (Zsh) ersetzen Sie das folgende gängige Konstrukt:
$ echo -n "Eingabe: "; read a
|
Aktion |
Bash |
Zsh |
Anmerkung |
|---|---|---|---|
|
Benutzereingabe (einfach) |
|
|
unterschiedliche Optionen |
|
Benutzereingabe (editierbar) |
|
|
|
|
Variablenausgabe |
|
|
ohne (großen) Unterschied |
|
Variablenausgabe |
– |
– |
|
Beachten Sie bei der Read-Anweisung der Bash, dass die Variable in Anführungszeichen steht. Das ermöglicht die Bearbeitung von Zeichenketten, in denen Leerzeichen vorkommen. Sowohl read als auch vared funktionieren auch ohne vorbelegte Variable. Listing 6 und Listing 7 zeigen die praktische Anwendung von read und vared in Shell-Skripten, Abbildung 10 die Ausführung.
Listing 6
read (Bash)
#!/bin/bash a="ALTER WERT" echo "Variable \$a ist vorbelegt: "$a read -ei "$a" -p "Eingabe: " a echo "Variable \$a mit neuem Wert: " $a
Listing 7
vared (Zsh)
#!/usr/bin/zsh a="ALTER WERT" echo "Variable \$a ist vorbelegt: "$a vared -p "Eingabe: " a echo "Variable \$a mit neuem Wert: "$a
Zu den möglichen Optionen des Bash-Read zählen Beschränkungen für Art und Anzahl der Zeichen sowie ein Auto-Enter nach erfolgter Eingabe. Das Zsh-spezifische Kommando print bietet zum Beispiel die sortierte Ausgabe in einem Rutsch. Die Option -o sortiert die Ausgabe aufsteigend, -O ordnet sie absteigend (Abbildung 11).
Die spaltenweise Ausgabe ermöglichen die Optionen -a zusammen mit entweder -c oder -CSpaltenzahl. Die Abbildung 12 zeigt einige Beispiele.
Weitere Unterschiede
Sowohl in der Bash als auch in der Zsh können Sie mehr oder weniger alle gebräuchlichen Sprachelemente verwenden. Damit verzichten Sie allerdings auf das eine oder andere Leistungsmerkmal. So bietet Zsh mit repeat Anzahl Befehl eine Möglichkeit, ein Kommando mehrfach hintereinander auszuführen (Abbildung 13). Geschickt eingesetzt, erhält man damit eine Art For-Schleife als übersichtlichen Einzeiler.
Die Zsh bietet einen umfangreichen Befehlssatz für Netzwerkoperationen mittels TCP/IP an. Datenübertragungen funktionieren mit dem ZFTP-Subsystem. Daneben integriert die Z-Shell eigene Kalenderfunktionen. Ein Teil dieser Zusatzfunktionen residiert in Plugins, die man entsprechend vorab laden muss.
Fazit
Beide Shells weisen viele Stärken auf und haben kaum Schwächen. Sowohl die Bash als auch die Zsh sind ausgereift, die Arbeit mit ihnen macht Spaß. Beim Ausstattungsumfang hat die Z-Shell klar die Nase vorn. Nach einer Einarbeitung in die zusätzlichen Funktionen steht Ihnen ein prall gefüllter Werkzeugkasten zur Verfügung. (jlu)
Der Autor
Harald Zisler beschäftigt sich seit den frühen 1990er-Jahren mit FreeBSD und Linux. Zu Technik- und EDV-Themen verfasst er Zeitschriftenbeiträge und Bücher.
Infos
-
Handbuch Bash: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html
-
Handbuch Zsh: http://zsh.sourceforge.net/Doc/
-
Bash-Prompt gestalten: https://wiki.archlinux.de/title/Bash-Prompt_anpassen
-
Zsh-Prompt gestalten: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html


















