Zsh vs. Bash Scripting. Was ist der Unterschied?

Zsh vs. Bash Scripting. Was ist der Unterschied?
Leser wie Sie unterstützen MUO. Wenn Sie über Links auf unserer Website einen Kauf tätigen, erhalten wir möglicherweise eine Affiliate-Provision. Mehr lesen.

Beim Shell-Scripting auf Unix-ähnlichen Betriebssystemen dominieren zwei Shells: Bash (Bourne Again Shell) und Zsh (Z Shell). Wenn Sie Programmierer oder Systemadministrator sind, hat die Wahl zwischen diesen beiden erheblichen Einfluss auf Ihre Effizienz und Produktivität.





MUO-Video des Tages Scrollen Sie, um mit dem Inhalt fortzufahren

Wenn Sie die Unterschiede und Gemeinsamkeiten zwischen diesen beiden Shells verstehen, können Sie Ihren Befehlszeilen-Workflow optimieren. Wenn Sie die Nuancen jeder Schale kennen, können Sie fundierte Entscheidungen treffen.





Wie komme ich am Schul-WLAN vorbei?

Was sind Bash und Zsh?

Bash ist sowohl auf Linux- als auch auf macOS-Systemen beliebt. Es handelt sich um ein leistungsstarkes Tool, mit dem Sie mit dem Betriebssystem interagieren und Befehle ausführen können. Du kannst auch Verwenden Sie Bash für Shell-Scripting , das Aufgaben automatisiert, indem es Skripte schreibt, die mehr als einen Befehl enthalten.





Zsh (Z-Shell) ist eine erweiterte Version von Bash, die viele weitere Funktionen bietet. Es ist die Standard-Shell unter macOS. Auch auf Linux-Systemen erfreut es sich immer größerer Beliebtheit.

So wechseln Sie von Bash zu Zsh

Wenn Sie ein Linux-System verwenden und zu Zsh wechseln möchten, beginnen Sie mit Verwenden Sie Ihren Paketmanager, um es zu installieren . Verwenden Sie beispielsweise unter Debian oder Ubuntu den folgenden Befehl:



 sudo apt install zsh

Wechseln Sie nach der Installation auf Ihrem System dorthin, indem Sie den folgenden Befehl ausführen:

 chsh -s $(which zsh)

Wenn Sie macOS verwenden, ist Zsh bereits installiert. Um dorthin zu wechseln, führen Sie den folgenden Befehl aus:





 chsh -s /bin/zsh

Um zurück zu Bash zu wechseln, ersetzen Sie Zsh in den obigen Befehlen durch Bash.

Um zu überprüfen, welche Shell Sie verwenden, führen Sie den folgenden Befehl aus:





 echo $SHELL

Dies hilft Ihnen zu bestätigen, dass Sie die Shell verwenden, die Sie beabsichtigt haben.

Unterschiede zwischen Zsh und Bash

Es gibt mehrere Unterschiede zwischen Zsh und Bash. Die Berücksichtigung dieser Unterschiede wird Ihnen bei der Entscheidung helfen, welche Schale am besten zu Ihnen passt.

1. Schnelle Anpassung

Zsh bietet eine einfachere Möglichkeit zum Anpassen Ihrer Eingabeaufforderungen % -basierte Escape-Sequenzen. Dies ermöglicht dynamische Eingabeaufforderungen mit Farbe und Informationen. Um Ihre Shell-Eingabeaufforderung anzupassen, definieren Sie die PS1 (Primäre Eingabeaufforderung).

 PS1="%F{green}%n@%m %F{blue}%~ %f$ " 

Die obige benutzerdefinierte Eingabeaufforderung zeigt den Benutzernamen, den Hostnamen und das aktuelle Verzeichnis in verschiedenen Farben an:

  Anpassung der Zsh-Eingabeaufforderung auf dem Terminal

Da sind viele andere Möglichkeiten, die Zsh-Eingabeaufforderung anzupassen , sodass Sie einen Admin-Indikator festlegen, Datum und Uhrzeit angeben und die neue Eingabeaufforderung speichern können.

Bash verwendet einen etwas anderen Ansatz, wenn es um die sofortige Anpassung geht. Es verwendet Escape-Codes, um Farb- und Formatierungsänderungen in der Eingabeaufforderung anzugeben. Um die gleiche Anpassung wie oben bei Zsh zu erreichen, können Sie die folgende benutzerdefinierte Eingabeaufforderung verwenden.

Wie man WLAN repariert, hat keine gültige IP-Konfiguration
 PS1="\[3[32m\]\u@\h \[3[34m\]\w \[3[0m\]$ " 

Benutzen \[3[0m\] ist von entscheidender Bedeutung, da dadurch sichergestellt wird, dass die Farbänderungen keinen Einfluss auf den Text haben, der auf die Eingabeaufforderung folgt.

2. Unterstützung für assoziative Arrays

Zsh unterstützt nativ assoziative Arrays. Diese Arrays bieten eine bequeme Möglichkeit, Daten zu verknüpfen, was das Organisieren und Abrufen von Informationen erleichtert. Verwenden erklären -A Befehl zum expliziten Deklarieren eines assoziativen Arrays:

 # Declare an associative array in Zsh  
declare -A my_assoc_array

Anschließend können Sie dem assoziativen Array Werte zuweisen:

 my_assoc_array=(key1 value1 key2 value2) 

Und schließlich greifen Sie mit ihren Schlüsseln auf die Werte zu:

 echo $my_assoc_array[key1] # Outputs: value1

Bash bietet native Unterstützung für assoziative Arrays seit Version 4.0. Sie deklarieren und weisen Werte auf die gleiche Weise zu wie in Zsh. Wenn Sie jedoch auf Array-Werte zugreifen möchten, müssen Sie den Schlüssel in geschweifte Klammern setzen:

 echo "${my_assoc_array[key1]}" 

Der Hauptunterschied besteht darin, dass die Unterstützung von Zsh für assoziative Arrays umfangreicher und fortschrittlicher ist als die von Bash. Mit Zsh können assoziative Arrays Schlüssel verschiedener Datentypen und nicht nur Zeichenfolgen enthalten. Bash unterstützt nur Zeichenfolgenschlüssel.

In früheren Versionen von Bash müssen Sie eine Möglichkeit zur Problemumgehung finden oder über externe Tools verfügen, um assoziative Arrays zu verwenden.

3. Erweiterte Globbing-Muster

Erweiterte Globbing-Muster bieten eine leistungsstarke und flexible Möglichkeit, Dateien und Verzeichnisse anhand verschiedener Kriterien auszuwählen und zu bearbeiten. Sie sind nützlich, wenn Sie mit komplexen Dateistrukturen arbeiten oder eine präzise Kontrolle über die Dateiauswahl benötigen.

In einem Zsh-Skript können Sie diese Muster mithilfe von aktivieren setopt Befehl. Zum Beispiel, um allen zu entsprechen .txt Dateien im aktuellen Verzeichnis:

 setopt extended_glob 
txt_files=(*.txt)

Um alle Dateien außer denen mit der Erweiterung „.log“ abzugleichen:

 setopt extended_glob 
non_log_files=^(*.log)

In Bash müssen Sie sie mit aktivieren Geschäfte Befehl mit dem extglob Möglichkeit. Zum Beispiel, um allen zu entsprechen .txt Dateien im aktuellen Verzeichnis:

 shopt -s extglob 
txt_files=(*.txt)

Um alle Dateien außer denen mit abzugleichen .Protokoll Verlängerung:

 shopt -s extglob 
non_log_files=!(*.log)

Der Hauptunterschied zwischen Zsh und Bash, wenn es um Globbing-Muster geht, ist der Befehl, der zu ihrer Aktivierung verwendet wird. Beachten Sie jedoch, dass einige Operatoren zwischen den beiden Shells unterschiedlich sind.

4. Erweiterte Parametererweiterung

Zsh unterstützt die indirekte Erweiterung von Parametern. Dadurch können Sie den Wert einer Variablen erweitern, deren Name in einer anderen Variablen gespeichert ist. Um dies zu erreichen, müssen Sie dem Variablennamen ein Ausrufezeichen voranstellen ! .

 name="foo" 
result="${!name}"
echo "$result"

Bash hingegen ermöglicht von Haus aus keine indirekte Erweiterung. Die Problemumgehung hierfür ist die Verwendung von evalu eingebauter Befehl oder der ${!was} Syntax für indirekte Variablenreferenzen.

 name="world" 
var="name"
echo ${!var} # This will output: world

Ähnlichkeiten zwischen Bash und Zsh

Obwohl es Unterschiede zwischen Bash und Zsh gibt, weisen sie auch einige Gemeinsamkeiten auf.

1. Befehlszeilensyntax

Bash und Zsh verwenden eine ähnliche Befehlszeilensyntax. Das ist großartig, denn es bedeutet, dass die meisten Befehle und Skripte, die Sie schreiben, in beiden Shells funktionieren, ohne dass Änderungen erforderlich sind. Zsh basiert auf Bash und enthält daher dieselben grundlegenden Befehle und Funktionen.

So zeichnen Sie Ihren Bildschirm mit obs auf

Es gibt jedoch sehr geringfügige Unterschiede in der Syntax, die Sie identifizieren und anpassen müssen.

2. Konsistenz der Befehlsersetzung

Bei der Befehlsersetzung handelt es sich um den Vorgang, bei dem die Ausgabe eines Befehls in einen anderen eingebettet wird. Es ist zwischen beiden Shells konsistent.

 result=$(ls) 

Sowohl in Bash als auch in Zsh können Sie das verwenden $(Befehl) Syntax zum Ersetzen der Ausgabe eines Befehls in eine Variable. Dies ermöglicht eine einfache Portabilität von Skripten zwischen den beiden Shells.

3. Skript-Debugging-Option

Sowohl Bash als auch Zsh verwenden -X Flag für Skript-Debugging. Wenn Sie ein Skript mit diesem Flag ausführen, wird jeder Befehl angezeigt, bevor er ausgeführt wird. Dies hilft Ihnen, Probleme in Ihren Skripten zu identifizieren.

 # Debugging a script in both Bash and Zsh 
#!/bin/bash -x

echo "Debugging Bash script"

In diesem Bash-Skript ist die -X Flag ermöglicht das Debuggen. Sie können einen ähnlichen Ansatz in Zsh verwenden; einfach ersetzen bash mit zsh .

Überlegungen zur Wahl zwischen Zsh und Bash

  • Kompatibilität und Portabilität : Bash ist die Standard-Shell auf vielen Unix-basierten Systemen. Dies macht es zu einer sichereren Wahl für plattformübergreifendes Scripting. Wenn Ihre Skripte ohne Änderungen auf einer Vielzahl von Systemen ausgeführt werden sollen, ist Bash die bessere Option.
  • Skriptkomplexität und erweiterte Funktionen : Zsh bietet erweiterte Funktionen wie assoziative Arrays, erweiterte Globbing-Muster und erweiterte Parametererweiterung. Dies vereinfacht komplexe Skriptaufgaben. Wenn Ihre Skripte eine erweiterte String-Manipulation oder Datenstrukturen erfordern, ist Zsh die bessere Wahl.
  • Community- und Plugin-Ökosystem : Sowohl Bash als auch Zsh haben aktive Communities, aber Zsh hat eine stärkere Community und ein umfangreiches Ökosystem an Plugins und Themes. Wenn Sie Wert auf Anpassung legen, kann die lebendige Community und Plugin-Unterstützung von Zsh ein erheblicher Vorteil sein.
  • Einfaches Lernen : Wenn Sie mit Shell-Scripting noch nicht vertraut sind, ist Bash ein leichter zugänglicher Ausgangspunkt. Für Anfänger stehen umfangreiche Dokumentationen und Ressourcen zur Verfügung. Dies erleichtert das Erlernen der Grundlagen des Shell-Scriptings.

Automatisieren von Aufgaben mithilfe von Shell-Skripten

Es ist von großer Bedeutung, zu wissen, wie man Aufgaben mithilfe von Shell-Skripten automatisiert. Sie können sich wiederholende Aufgaben automatisieren und viel Zeit sparen.

Sie können diese Skripte auch verwenden, um Benutzerkonten zu verwalten, Systemressourcen zu überwachen, Daten zu sichern und routinemäßige Wartungsarbeiten durchzuführen. Wenn sie sorgfältig geschrieben werden, können sie auch das Risiko menschlicher Fehler verringern.