Bourne Again Shell und Z-Shell im Vergleich

Aus LinuxUser 01/2021

Bourne Again Shell und Z-Shell im Vergleich

© William Attard McCarthy, 123RF

Nase an Nase

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.

Abbildung 1: Das Startmenü bei einer noch nicht konfigurierten Z-Shell.

Abbildung 1: Das Startmenü bei einer noch nicht konfigurierten Z-Shell.


Abbildung 2: Das Hauptmenü zur Konfiguration der Z-Shell.

Abbildung 2: Das Hauptmenü zur Konfiguration der Z-Shell.

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.

Abbildung 3: Einstellungen zur Befehlshistorie.

Abbildung 3: Einstellungen zur Befehlshistorie.

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).

Abbildung 4: Weitere Einstellungen der Zsh.

Abbildung 4: Weitere Einstellungen der Zsh.

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

Abbildung 5: Anzeige der Prompt-Muster.

Abbildung 5: Anzeige der Prompt-Muster.

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

.bashrc

Einstellungen und Befehle für den Start der Shell (Login und manueller Aufruf)

.bash_profile

Einstellungen und Befehle für das Login

.bash_logout

Befehle für das Abmelden von einer Sitzung

Datei

Einträge/Hinweise

.zprofile

Einstellungen und Befehle für das Login

.zshenv

Einstellungen, die unabhängig von der Aufrufart der Shell gelten

.zshrc

Einstellungen und Befehle für den Start der Shell

.zlogin

Befehle für das Login

.zlogout

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.

Abbildung 6: Die Reihung der Konfigurationsdateien bei der Bash.

Abbildung 6: Die Reihung der Konfigurationsdateien bei der Bash.

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.

Abbildung 7: Die Reihung der Konfigurationsdateien bei der Zsh.

Abbildung 7: Die Reihung der Konfigurationsdateien bei der Zsh.

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.

Abbildung 8: Das automatische Starten von Anweisungen samt Benutzerabmeldung.

Abbildung 8: Das automatische Starten von Anweisungen samt Benutzerabmeldung.

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

\h

Vollständiger Rechnername

\H

Benutzername

\u

Aktuelles Arbeitsverzeichnis

\w

Uhrzeit

\t

Lfd. Nummer in der History

\!

Lfd. Befehlsnummer (Sitzung)

\#

Textfarbe

Schwarz

\[\033[0;30m\]

Blau

\[\033[0;34m\]

Rot

\[\033[0;31m\]

Grün

\[\033[0;32m\]

Gelb

\[\033[1;33m\]

Weiß

\[\033[1;37m\]

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.

Abbildung 9: Die Prompt-Gestaltung in der Bash.

Abbildung 9: Die Prompt-Gestaltung in der Bash.

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

%D

Zeit

%T

Rechnername ohne Domain

%m

Vollständiger Rechnername

%M

Benutzerkennung

%n

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)

read

read

unterschiedliche Optionen

Benutzereingabe (editierbar)

read -ei "$Variable" -p "Prompt" VAR

vared -p "Prompt" Variable

siehe Listing 6 und Listing 7

Variablenausgabe

printf

printf

ohne (großen) Unterschied

Variablenausgabe

print ähnelt echo, mit weiteren Optionen

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

Abbildung 10: Das Ausf&uuml;hren der Shell-Skripte aus <a href="#artRef-l6">Listing&nbsp;6</a> und <a href="#artRef-l7">Listing&nbsp;7</a>.

Abbildung 10: Das Ausführen der Shell-Skripte aus Listing 6 und Listing 7.

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).

Abbildung 11: Die Sortierfunktion des Zsh-Kommandos <code>print</code>.

Abbildung 11: Die Sortierfunktion des Zsh-Kommandos print.

Die spaltenweise Ausgabe ermöglichen die Optionen -a zusammen mit entweder -c oder -CSpaltenzahl. Die Abbildung 12 zeigt einige Beispiele.

Abbildung 12: Spaltenweise und sortierte Ausgabe mit <code>print</code>.

Abbildung 12: Spaltenweise und sortierte Ausgabe mit print.

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.

Abbildung 13: Das <code>repeat</code>-Kommando der Zsh im Einsatz.

Abbildung 13: Das repeat-Kommando der Zsh im Einsatz.

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.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 01/2021 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben