it-swarm.com.de

Sind alle Bash-Skripte mit `zsh` kompatibel?

Ich möchte von Bash zu Zsh wechseln, bin aber besorgt über die Kompatibilität von Bash-Skripten.

Sind alle Bash-Skripte/-Funktionen mit zsh kompatibel? Wenn das stimmt, ist zsh also nur eine Verbesserung für Bash?

75
chrisjlee

Wenn Ihre Skripte mit der Zeile #!/bin/bash Beginnen, werden sie weiterhin mit bash ausgeführt, auch wenn Ihre Standard-Shell zsh ist.

Ich habe festgestellt, dass die Syntax von zsh der von bash sehr nahe kommt, und ich habe nicht darauf geachtet, ob es wirklich einige Inkompatibilitäten gab. Ich habe vor 6 Jahren nahtlos von Bash zu Zsh gewechselt.

60
Huygens

Zsh kann die meisten Bourne-, POSIX- oder ksh88-Skripte ausführen, wenn Sie es in den richtigen Emulationsmodus versetzen (emulate sh Oder emulate ksh). Es werden nicht alle Funktionen von bash oder ksh93 unterstützt. Zsh hat die meisten Funktionen von Bash, aber in vielen Fällen mit einer anderen Syntax.

Die Shell, die Sie interaktiv verwenden, ist für jedes Skript, das Sie haben, irrelevant. Die Shell, die die Skripte ausführt, ist die in der ersten Zeile, der Zeile Shebang , angegebene. Wenn das Skript beispielsweise mit #!/bin/bash Beginnt, wird es von bash ausgeführt.

Wenn Sie Bash angepasst haben, können Sie Ihren .bashrc Nicht einfach in .zshrc Umbenennen. Einige Dinge können gemeinsam genutzt werden, z. B. Aliase und Funktionen, solange Sie sich an den Schnittpunkt zwischen den beiden Shells halten (der Schnittpunkt liegt nahe bei ksh88 und pdksh ). Andere Dinge wie Eingabeaufforderungseinstellungen, Abschlussfunktionen und die meisten Optionen müssen vollständig neu geschrieben werden.

Wenn Sie ein Snippet schreiben, das von Personen aus ihrem .bashrc Oder .zshrc Beschafft werden soll, und Sie nicht zwei Versionen beibehalten möchten, halten Sie sich an eine gemeinsame Untergruppe von Bash- und Zsh-Funktionen, einschließlich die meisten Programmierfunktionen von bash. Fügen Sie Ihren gesamten Code in Funktionen ein und setzen Sie die folgende Zeile oben in jede Funktion:

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

Sie können emulate sh Anstelle von emulate ksh Verwenden, um der einfachen sh-Syntax näher zu kommen, die Sie für .profile Benötigen.

Wenn eine Funktion eine andere Funktion aufruft, erbt die andere Funktion die Emulationseinstellung, sodass Sie diese Zeile nicht in interne Funktionen einfügen müssen, sondern nur in Funktionen, die vom Endbenutzer aufgerufen werden.

Wenn der Shebang #!/bin/bash Ist und Sie das Skript als ./script Starten, wird das Skript per Bash ausgeführt. Absolut kein Problem hier.

Wenn Sie jedoch zsh ./script Ausführen oder . ./script An die laufende zsh-Instanz senden, stimmt die Syntax von bash und zsh häufig nicht überein.

Zum Beispiel teilt zsh Parametererweiterungen nicht standardmäßig auf, bash hat eine eingebaute Hilfe, es gibt kein read -p Prompt In zsh (die Syntax ist sehr unterschiedlich read cmd \? Prompt, arrays start on 1 (not 0) in zsh, commandonly search for external commands in zsh, or there is no (simple) equivalent to $ {foo ^} `(nur Großbuchstaben nur erstes Zeichen) unter anderem in zsh. Dies ist eine lange Liste von (meistens) Ähnlichkeiten und einige Unterschiede .

In einigen Fällen kann zsh angewiesen werden, andere Shells zu emulieren. In einigen Fällen ist keine gemeinsame Syntax möglich, die auf beide Shells portierbar ist (ohne Aliase oder Funktionen zum Emulieren portabler Lösungen zu verwenden).

Zsh verfügt jedoch über viele (viele) Erweiterungen, die das interaktive Arbeiten erleichtern. Das ist gleichzeitig ein hervorragender Grund für einen Wechsel und ein Problem:

  1. Pro zsh

    • Es ist sehr schön zu sehen, wie Befehlssyntaxoptionen auf eine Registerkarte gedrückt werden.
    • Ein weiterer großer Vorteil von zsh ist die Fehlerkorrektur, wenn Sie einen Tippfehler machen. Anstatt nur Fehler anzuzeigen: Befehl nicht gefunden, versucht zsh zu interpretieren, was Sie eingegeben haben. zsh akzeptiert diese Eingabe als gültigen Befehl.
    • Außerdem verfügt zsh über viele Modifikatoren für Erweiterungen, die eine große Auswahl an Lösungen ermöglichen. Like: Nur Dateien auflisten: ls *(.) (was bei anderen Shells schwierig ist). Auch wenn bei tiefem Hinsehen die Antwort in zsh (print -rl -- *(/)) komplex wird.
    • Akzeptiere Mathe mit Floats (mit einigen Einschränkungen).
  2. Con zsh:

    • Bash ist die Standard-Shell in vielen weiteren Systemen.
    • Viele zsh-Optionen helfen nicht direkt beim Schreiben von Bash-kompatiblen Skripten.
    • Es könnte sogar zu einem großen Problem werden, zwei Muscheln gleichzeitig zu lernen.

Am Ende ist es Ihre Wahl, und ich mag immer mehr Entscheidungen.

6
Isaac