Sind alle bash-Skripte mit `zsh` kompatibel?

63

Ich bin auf der Suche nach einem Wechsel von Bash zu Zsh, bin aber besorgt über die Kompatibilität von Bash-Skripten.

Sind alle bash Skripte / Funktionen mit zsh kompatibel? Wenn das stimmt, ist zsh dann nur eine Verbesserung von bash?

chrisjlee
quelle
Ich fand das nützlich: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Antworten:

55

Wenn Ihre Skripte mit der Zeile beginnen, werden #!/bin/bashsie 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 gibt. Ich habe vor 6 Jahren nahtlos von bash auf zsh gewechselt.

Huygens
quelle
1
Was war Ihre größte Herausforderung bei der Umstellung?
Chrisjlee
4
Keiner. Meine persönlichen Skripte enthalten den richtigen Verweis auf bash, und ich hatte zunächst eine gute .zshrc-Datei gefunden. Zsh und Bash waren so ähnlich, dass ich es nicht wirklich herausfordernd fand.
Huygens
4
können Sie Ihre .zshrc
auflisten
Aber ob die Zeile #!/bin/bashignoriert wird, wenn die Skriptdatei wie ausgeführt wird source ./script.sh?
LCB
3
Das Hardg-Codieren des Pfads zur Shell ist ein schlechter Rat, auch wenn dies häufig durchgeführt wird. Sie sollten #!/usr/bin/env bashstattdessen vor allem auf macOS verwenden, wo die Standard-Bash stark veraltet ist und neue Versionen praktisch immer in einem anderen Pfad installiert werden.
Konrad Rudolph
29

Zsh kann die meisten Bourne-, POSIX- oder ksh88-Skripte ausführen, wenn Sie es in den richtigen Emulationsmodus versetzen ( emulate shoder 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 Shebang- Zeile, angegebene. Beginnt das Skript beispielsweise mit #!/bin/bash, wird es von bash ausgeführt.

Wenn Sie bash angepasst haben, werden Sie nicht in der Lage sein , nur Ihre umbenennen .bashrczu .zshrc. Einige Dinge können geteilt werden, zum Beispiel Aliase und Funktionen, solange Sie sich an den Schnittpunkt zwischen den beiden Shells halten (der Schnittpunkt liegt in der Nähe von ksh88 und pdksh ). Andere Dinge, wie Einstellungen für Eingabeaufforderungen, Abschlussfunktionen und die meisten Optionen, müssen komplett neu geschrieben werden.

Wenn Sie einen Ausschnitt gerade schreiben für Menschen aus ihren beziehen .bashrcoder , .zshrcund Sie wollen nicht zwei Versionen zu erhalten, halten Sie sich an eine gemeinsame Untergruppe von bash und zsh Features, die die meisten von bash Programmierfunktionen beinhaltet. Fügen Sie Ihren gesamten Code in Funktionen ein und setzen Sie die folgende Zeile am Anfang jeder Funktion:

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

Sie können verwenden, emulate shanstatt emulate kshnäher an der einfachen Syntax zu sein. Dafür benötigen Sie diese .profile.

Wenn eine Funktion eine andere Funktion aufruft, übernimmt 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.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Die von Ihnen verwendete Shell ist irrelevant, wenn Sie Ihre Skripte als ausführen ./my_script.sh. source my_script.shund . my_script.shes wird ausgeführt wie die aktuelle Shell, ignoriert jeden Schebang.
BallpointBen
3

Wenn der Schebang ist #!/bin/bashund Sie das Skript starten, wird das Skript ./scriptvon Bash ausgeführt. Absolut kein Problem hier.

Wenn Sie es jedoch ausführen zsh ./scriptoder . ./scriptan die laufende zsh-Instanz senden, stimmen die Syntax von bash und zsh häufig nicht überein.

Zum Beispiel teilt zsh standardmäßig keine Parametererweiterungen auf, bash hat eine eingebaute Hilfe, es gibt keine read -p promptin zsh (die Syntax ist sehr unterschiedlich) read cmd \? Prompt , arrays start on 1 (not 0) in zsh,command only search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(nur das erste Zeichen in Großbuchstaben) in zsh Dies ist eine lange Liste von (meist) Ähnlichkeiten und einigen Unterschieden .

In einigen Fällen kann zsh angewiesen werden, andere Shells zu emulieren. In einigen Fällen ist keine gemeinsame, auf beide Shells übertragbare Syntax möglich (ohne die Verwendung von Aliasen oder Funktionen zur Emulation von tragbaren Lösungen).

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

  1. Pro zsh

    • Es ist sehr schön, Befehls-Syntaxoptionen zu sehen, die auf einen Tabulator drücken.
    • Ein weiterer großer Vorteil von zsh ist die Fehlerkorrektur, wenn Sie einen Tippfehler machen. Anstatt nur den 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 zahlreiche Modifikatoren für Erweiterungen, die eine Vielzahl von Lösungen ermöglichen. Like: liste nur Dateien auf ls *(.)(was bei anderen Shells schwierig ist). Auch wenn die Antwort bei genauer Betrachtung auch 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.

Isaac
quelle