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?
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?
Antworten:
Wenn Ihre Skripte mit der Zeile beginnen, werden #!/bin/bash
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 gibt. Ich habe vor 6 Jahren nahtlos von bash auf zsh gewechselt.
.zshrc
#!/bin/bash
ignoriert wird, wenn die Skriptdatei wie ausgeführt wird source ./script.sh
?
#!/usr/bin/env bash
stattdessen vor allem auf macOS verwenden, wo die Standard-Bash stark veraltet ist und neue Versionen praktisch immer in einem anderen Pfad installiert werden.
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 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 .bashrc
zu .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 .bashrc
oder , .zshrc
und 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 sh
anstatt emulate ksh
nä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.
./my_script.sh
. source my_script.sh
und . my_script.sh
es wird ausgeführt wie die aktuelle Shell, ignoriert jeden Schebang.
Wenn der Schebang ist #!/bin/bash
und Sie das Skript starten, wird das Skript ./script
von Bash ausgeführt. Absolut kein Problem hier.
Wenn Sie es jedoch ausführen zsh ./script
oder . ./script
an 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 prompt
in 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:
ls *(.)
(was bei anderen Shells schwierig ist). Auch wenn die Antwort bei genauer Betrachtung auch in zsh ( print -rl -- *(/)
) komplex wird .Con zsh:
Am Ende ist es Ihre Wahl, und ich mag immer mehr Entscheidungen.