Was sind die praktischen Unterschiede zwischen Bash und Zsh?

Mit der Nachricht, dass Catalina standardmäßig Zsh anstelle von Bash verwendet, bin ich „m Ich habe viele Ergebnisse gefunden, die mir über den Wechsel erzählen und die möglicherweise Probleme mit Shell-Skripten verursachen, aber ich bin mit Zsh nicht vertraut genug, um zu wissen, was diese Probleme sein könnten.

Meine Shell-Skripte sind es wirklich nicht Das ist kompliziert, aber ich habe Bash bisher nur unter MacOS und Linux verwendet – keine Erfahrung mit Zsh. Kann jemand einen einfachen praktischen Vergleich oder bestimmte Stolpersteine liefern, die ich wissen muss, damit ich darauf hinarbeiten kann, bereit für das zu sein? Neue Shell, wenn Catalina veröffentlicht wird?

Kommentare

  • All dieser Trubel, den Sie gelesen haben, hat viel gegen nichts zu tun. Das Betriebssystem weist ein “ Standard “ Shell beim Erstellen neuer Benutzer, kein Grund mehr. Bash ist nicht ‚ läuft entfernt, und Sie können das als Ihre Muschel oder eine der anderen Muscheln verwenden c Derzeit angeboten.
  • Als jemand zu sprechen, der ‚ beide verwendet hat und auf Bash gelandet ist – das einzige, was mich wirklich zutiefst unzufrieden mit zsh gemacht hat, war seine Entscheidung Um die POSIX-Konformität zu brechen, wenn der Standard zugegebenermaßen schlechte Entwurfsentscheidungen auf eine Weise kanonisiert, die es leicht machte, beim Versuch, Skripte zu schreiben, die mit anderen, streng POSIX-superset-Shells kompatibel sein mussten, schlampig zu werden. Leider kann das einzige “ “ ziemlich große sein. Trotzdem geht ksh93 nicht ‚ weg, und jeder, der es ernst meint mit Bash, würde ‚ die alte Version 3.x, die Apple liefert, sowieso nicht verwenden.
  • Als Folge – Catalina gestern installiert, auf zsh umgestellt, bash_history importiert und einige meiner bevorzugten Aliase aus bash_profile kopiert, scheint nichts kaputt gegangen zu sein. Schätzen Sie alle Informationen, die hier von allen bereitgestellt werden, und hoffentlich hilft sie auch anderen.
  • @CharlesDuffy: Guter Kommentar. WRT ist “ schwerwiegend “ und verwendet bash version 3.2.57(1): Wissen Sie, ob Apple bash für alles “ wichtige “ auf dem System?

Antwort

Zunächst einige wichtige Dinge:

  1. Bash geht nicht weg . Wenn Sie bereits bash verwenden, ändert sich nichts für Sie. Alles, was sich ändert, ist, dass zsh die Standard-Anmeldeshell für neue Konten ist. Selbst dann können Sie stattdessen bash auswählen.
  2. Skripte sind nicht betroffen . Was sich ändert, ist die Shell für die interaktive Verwendung, d. H. Die Shell in Terminals (und auch einige andere Dinge, die die Login-Shell verwenden, wie z. B. Crontabs). Wenn Sie ein Skript in einer Datei mit Ausführungsberechtigungen haben, beginnend mit einer shebang-Zeile wie #!/bin/bash oder #!/bin/sh oder #!/usr/bin/env bash funktioniert weiterhin genau wie zuvor.
  3. Die Syntax von Zsh ist nicht vollständig mit bash kompatibel , aber es ist nah. Eine Menge Code wird weiter funktionieren, zum Beispiel typische Aliase und Funktionen. Die Hauptunterschiede liegen in den interaktiven Konfigurationsfunktionen.

Angenommen, Sie erwägen einen Wechsel Für zsh, was seit Jahren möglich ist, sind hier die Hauptunterschiede, auf die Sie stoßen werden. Dies ist keine vollständige Liste!

Hauptunterschiede für die interaktive Verwendung

Konfigurationsdateien : Bash liest (hauptsächlich) .bashrc in interaktiven Shells ohne Anmeldung (aber macOS startet standardmäßig eine Anmeldeshell in Terminals), .profile oder in Login-Shells und .inputrc. Zsh liest (hauptsächlich) .zshrc (in allen interaktiven Shells) und .zprofile (in Login-Shells). Dies bedeutet, dass keine Ihrer Bash-Anpassungen angewendet wird: Sie müssen sie portieren. Sie können die Dateien nicht einfach kopieren, da viele Dinge optimiert werden müssen.

Tastenkombinationen verwenden eine völlig andere Syntax. Bash verwendet .inputrc und die eingebaute bind , um Schlüssel an readline-Befehle . Zsh verwendet das bindkey integrierte , um Schlüssel an zle-Widgets zu binden . Die meisten Readline-Befehle haben ein zsh-Äquivalent, aber es ist nicht immer eine perfekte Äquivalenz.

Apropos Tastenbelegung: Wenn Sie Vi (m) als In-Terminal-Editor, jedoch nicht als Befehlszeilenmodus in der Shell verwenden, werden Sie feststellen, dass zsh standardmäßig den vi-Bearbeitungsmodus verwendet, wenn EDITOR oder VISUAL wird auf vi oder vim gesetzt bindkey -e wechselt in den Emacs-Modus.

Eingabeaufforderung : bash setzt die Eingabeaufforderung (hauptsächlich) von PS1 , die Backslash wird ausgeblendet . Zsh setzt die Eingabeaufforderung hauptsächlich von PS1 , die Prozent entkommt . Die Funktionalität von bash“ s PROMPT_COMMAND ist in verfügbar zsh über die precmd und preexec Hakenfunktionen . Zsh verfügt über bequemere Mechanismen zum Erstellen ausgefallener Eingabeaufforderungen, einschließlich eines Eingabeaufforderungs-Themenmechanismus .

Der grundlegende Befehlszeilenverlauf Mechanismen (Navigation mit Up / Down , Suche mit Strg + R , Verlaufserweiterung mit !! und Freunden, letzter Argumentrückruf mit Alt + . oder $_) funktioniert auf die gleiche Weise, aber es gibt viele Unterschiede in den Details, zu viele, um sie hier aufzulisten. Sie können Ihre .bash_history nach .zsh_history kopieren, wenn Sie keine Shell-Option geändert haben, die das Dateiformat ändert.

Vervollständigung : Beide Shells verwenden standardmäßig einen grundlegenden Vervollständigungsmodus, der meistens Befehls- und Dateinamen vervollständigt, und wechseln in einen ausgefallenen Modus von Einschließlich bash_completion bei bash oder durch Ausführen von compinit in zsh. Sie werden einige Befehle finden, die bash besser handhabt, und einige, die zsh besser handhabt. Zsh ist normalerweise präziser, gibt aber manchmal auf, wo bash etwas tut, das nicht korrekt, aber sinnvoll ist. Um mögliche Abschlüsse für einen Befehl anzugeben, verfügt zsh über drei Mechanismen:

Viele der bash-Einstellungen shopt haben eine entsprechende setopt in zsh.

Zsh doe sn „t # wird standardmäßig nur in Skripten als Kommentarstart in der Befehlszeile behandelt (einschließlich .zshrc und dergleichen). Führen Sie zum Aktivieren interaktiver Kommentare setopt interactive_comments aus.

Hauptunterschiede für die Skripterstellung

(und natürlich für Hauptbenutzer in der Befehlszeile)

In bash nimmt $foo den Wert foo teilt es in Leerzeichen auf und ersetzt für jedes durch Leerzeichen getrennte Teil das Muster durch die Liste der Übereinstimmungen, wenn es Platzhalterzeichen enthält und mit einer vorhandenen Datei übereinstimmt. Um nur den Wert von foo zu erhalten, benötigen Sie "$foo". Gleiches gilt für die Befehlssubstitution $(foo). In zsh ist $foo der Wert von foo und $(foo) die Ausgabe von foo abzüglich der letzten Zeilenumbrüche, mit zwei Ausnahmen. Wenn ein Wort aufgrund der Erweiterung leerer nicht zitierter Variablen leer wird, wird es entfernt (z. B. a=; b=; printf "%s\n" one "$a$b" three $a$b five druckt one, eine leere Zeile, three, five). Das Ergebnis einer nicht zitierten Befehlssubstitution wird in Leerzeichen aufgeteilt, aber die Teile werden nicht mit Platzhaltern abgeglichen.

Bash Arrays werden von 0 bis (Länge-1) indiziert. Zsh-Arrays werden von 1 bis Länge indiziert. Mit a=(one two three) ist ${a[1]} in bash two, aber in zsh ist es „s“ one. Wenn Sie in bash nur auf eine Array-Variable ohne geschweifte Klammern verweisen, erhalten Sie das erste Element, z. B. $a ist one und $a[1] ist one[1].In zsh wird $a in die Liste der nicht leeren Elemente und $a[1] in das erste Element erweitert. In ähnlicher Weise beträgt in bash die Länge eines Arrays ${#a}; Dies funktioniert auch in zsh, aber Sie können es einfacher als $#a schreiben. Sie können die 0-Indizierung als Standard festlegen, indem Sie setopt ksh_arrays verwenden. Dies aktiviert auch die Anforderung, geschweifte Klammern zu verwenden, um auf ein Array-Element zu verweisen.

Bash verfügt über zusätzliche Platzhaltermuster wie @(foo|bar), um foo oder bar, die nur mit shopt -s extglob aktiviert werden. In zsh können Sie diese Muster mit setopt ksh_glob aktivieren, aber es gibt auch eine einfachere Eingabe native Syntax wie (foo|bar), für die teilweise setopt extended_glob erforderlich ist (do Geben Sie dies in Ihre .zshrc ein, und es ist standardmäßig in den Abschlussfunktionen aktiviert. **/ für die rekursive Verzeichnisüberquerung ist in zsh immer aktiviert.

Wenn ein Platzhaltermuster in Bash standardmäßig nicht mit einer Datei übereinstimmt, bleibt es übrig unverändert. In zsh wird standardmäßig „ein Fehler angezeigt, was normalerweise die sicherste Einstellung ist. Wenn Sie einen Platzhalterparameter an einen Befehl übergeben möchten, verwenden Sie Anführungszeichen. Sie können mit setopt no_nomatch . Sie können nicht übereinstimmende Platzhaltermuster stattdessen mit setopt null_glob .

In bash wird die rechte Seite einer Pipeline in einer Subshell ausgeführt. In zsh wird sie in der übergeordneten Shell ausgeführt Sie können Dinge wie somecommand | read output schreiben.

Einige nette zsh-Funktionen

Hier sind einige nette zsh-Funktionen, die bash nicht hat ( zumindest nicht ohne ernsthaftes Ellbogenfett). Dies ist wiederum nur eine Auswahl derjenigen, die ich für am nützlichsten halte.

Glob-Qualifizierer ermöglicht den Abgleich von Dateien basierend auf Metadaten wie Zeitstempel, Größe usw. Sie ermöglichen auch die Optimierung der Ausgabe. Die Syntax ist ziemlich kryptisch, aber äußerst praktisch. Hier einige Beispiele:

  • foo*(.): Nur reguläre Dateien, die mit foo* und symbolische Links zu regulären Dateien, nicht zu Verzeichnissen und anderen speziellen Dateien.
  • foo*(*.): Nur ausführbare reguläre Dateien, die mit foo*.
  • foo*(-.): Nur reguläre Dateien, die mit foo* übereinstimmen, keine symbolischen Links und andere spezielle Dateien.
  • foo*(-@): Nur baumelnde symbolische Links, die mit foo* übereinstimmen.
  • foo*(om): Die Dateien, die mit foo* übereinstimmen, sortiert nach dem letzten Änderungsdatum, dem letzten zuerst. Beachten Sie dies, wenn Sie dies an ls, es wird seine eigene Sortierung durchführen. Dies ist besonders nützlich in…
  • foo*(om[1,10]): Die 10 neuesten Dateien, die mit foo* übereinstimmen, die neueste zuerst.
  • foo*(Lm+1): Dateien, die mit foo* übereinstimmen und deren Größe mindestens 1 MB beträgt.
  • foo*(N): Wie foo*, aber wenn dies mit keiner Datei übereinstimmt, erstellen Sie trotzdem eine leere Liste der Einstellung der Option null_glob (siehe oben).
  • *(D): Alle Dateien einschließlich Punktdateien abgleichen ( außer . und ..).
  • foo/bar/*(:t) (unter Verwendung von a Verlaufsmodifikator ): Die Dateien in foo/bar, jedoch nur mit dem Basisnamen der Datei a foo/bar/qux.txt wird als qux.txt erweitert.
  • foo/bar/*(.:r): Nehmen Sie reguläre Dateien unter foo/bar und entfernen Sie die Erweiterung. Z.B. foo/bar/qux.txt wird als foo/bar/qux erweitert.
  • foo*.odt(e\""REPLY=$REPLY:r.pdf"\"): Nehmen Sie die Liste der Dateien, die mit foo*.odt übereinstimmen, und ersetzen Sie .odt durch .pdf (unabhängig davon, ob das PDF vorliegt Datei existiert).

Hier sind einige nützliche zsh-spezifische Platzhaltermuster .

  • foo*.txt~foobar*: alle .txt -Dateien, deren Name mit foo beginnt, jedoch nicht mit foobar.
  • image<->.jpg(n): alle .jpg -Dateien, deren Basisname image ist, gefolgt von einer Zahl, zimage3.jpg und image22.jpg, jedoch nicht image-backup.jpg. Das glob-Qualifikationsmerkmal (n) bewirkt, dass die Dateien in numerischer Reihenfolge aufgelistet werden, dh image9.jpg steht vor image10.jpg (Sie können dies auch ohne -n mit setopt numeric_glob_sort ).

Um Dateien umbenennen , bietet zsh eine sehr praktische Möglichkeit Tool: Die Funktion zmv . Vorgeschlagen für Ihre .zshrc:

autoload zmv alias zcp="zmv -C" zln="zmv -L" 

Beispiel:

zmv "(*).jpeg" "$1.jpg" zmv "(*)-backup.(*)" "backups/$1.$2" 

Bash bietet einige Möglichkeiten, Transformationen anzuwenden, wenn der Wert einer Variablen verwendet wird . Zsh hat einige der gleichen und viele mehr .

Zsh bietet eine Reihe kleiner praktischer Funktionen zum Ändern von Verzeichnissen . Aktivieren Sie setopt auto_cd , um in ein Verzeichnis zu wechseln, wenn Sie dessen Namen eingeben, ohne (bash hat dies heutzutage auch). Sie können das Formular mit zwei Argumenten für cd verwenden, um in ein Verzeichnis zu wechseln, dessen Name sich in der Nähe des aktuellen Verzeichnisses befindet . Wenn Sie beispielsweise „in /some/where/foo-old/deeply/nested/inside sind und zu /some/where/foo-new/deeply/nested/inside wechseln möchten, geben Sie einfach cd old new.

Um einer Variablen einen Wert zuzuweisen, schreiben Sie natürlich VARIABLE=VALUE. Um zu bearbeiten Wenn der Wert einer Variablen interaktiv ist, führen Sie einfach vared VARIABLE aus.

Abschließende Hinweise

Zsh wird mit einer Konfigurationsoberfläche geliefert, die einige der gängigsten Einstellungen unterstützt, einschließlich vordefinierter Rezepte für Dinge wie die Vervollständigung ohne Berücksichtigung der Groß- und Kleinschreibung. Um diese Schnittstelle (erneut) auszuführen (Die erste Zeile wird nicht benötigt, wenn Sie eine Konfigurationsdatei verwenden, die von zsh-newuser-install bearbeitet wurde.)

autoload -U zsh-newuser-install zsh-newuser-install 

Sofort ohne Konfigurationsdatei sind viele nützliche Funktionen von zsh aus Gründen der Abwärtskompatibilität mit den Versionen von 1990 deaktiviert. zsh-newuser-install schlägt einige empfohlene Funktionen zum Aktivieren vor.

Es gibt viele zsh-Konfigurationsframeworks im Web (viele davon sind auf Github ). Sie können eine bequeme Möglichkeit sein, mit einigen leistungsstarken Funktionen zu beginnen. Die Kehrseite der Medaille ist, dass sie Sie oft daran hindern, Dinge so zu tun, wie es der Autor tut. Manchmal hindern sie Sie daran, Dinge so zu tun, wie Sie es möchten. Verwenden Sie sie auf eigenes Risiko.

Die Das zsh-Handbuch enthält viele Informationen, ist jedoch häufig so geschrieben, dass es knapp und schwer zu befolgen ist, und enthält nur wenige Beispiele. Zögern Sie nicht, online nach Erklärungen und Beispielen zu suchen: Wenn Sie nur den Teil von verwenden Wenn das im Handbuch leicht zu verstehen ist, werden Sie es verpassen. Zwei gute Ressourcen sind die Mailingliste der zsh-Benutzer und Unix Stack Exchange . Eine umfangreiche Sammlung von Artikeln zum Umschalten auf zsh auf dem Mac finden Sie auf scriptingosx.com und eine nützliche Ruby-Skript zum Mitbringen Ihres Befehlsverlaufs finden Sie auf Github.

Kommentare

  • Jetzt ‚ frage ich mich, ob die erstaunliche Strg-O auf zsh funktioniert. Natürlich funktioniert ‚ auch unter Bash unter Mac OS nicht, daher ist ‚ für diese Antwort oder Site nicht wirklich relevant. Ich konnte ‚ in einer schnellen Online-Suche keine Informationen zu Strg-O in zsh finden, aber andererseits sind die Informationen zu Strg-O in Bash auch allgemein ungenau …
  • @Jasper Ich wusste nicht ‚, dass bash dies hatte. Gemäß der Beschreibung macht Co dasselbe in zsh mit den Standardtastenbindungen.
  • Ich war froh zu sehen, dass Sie die “ Einige nette zsh-Funktionen aufgenommen haben “ und lesen Sie ihn gespannt durch, um zu verstehen, warum Apple möglicherweise die Entscheidung getroffen hat, vom äußerst verbreiteten Bash zum viel weniger beliebten Zsh zu wechseln. Ich habe ‚ überhaupt nichts gefunden, auch nicht aus der Ferne, um den Wechsel zu rechtfertigen. Es ist ‚ offensichtlich eine nicht erschöpfende Liste, aber haben Sie die Überschriftenfunktionen von Zsh weggelassen, weil sie ‚ offensichtlich sein sollen? Was fehlt mir hier?
  • @CodyGray Ich weiß es nicht ‚ und Apple ist nicht ‚ gewohnt sich zu rechtfertigen. Es könnte etwas damit zu tun haben, dass es ‚ keinen Abschnitt mit „netten Bash-Funktionen“ geben würde, wenn sich die Situation umgekehrt hätte.Oder es kann sein, dass die letzte Nicht-GPLv3-Bash wirklich alt wird , während zsh eine liberalere Lizenz hat.
  • Mein Verständnis war das Die Lizenzierung war im Wesentlichen der einzige Grund. Es ist auch ‚, warum bash auf macOS immer noch v3 ist. Auf der Straße heißt es, dass Bash ‚ nicht aktualisiert wird und erwartet wird, dass es entfernt wird, es sei denn, der Endbenutzer installiert es über Brew oder usw. Mein Plan war, zu zu wechseln zsh eher früher als später für macOS, aber im Moment bleiben wir bei Debian.

Antwort

Ändern Ihre Shell jetzt und testen – Sie müssen nicht warten.

chsh -s /bin/zsh 

Außerdem würde ich schätzen, dass 95% der MacOS-Benutzer keine Befehlszeile verwenden, und von denen, die dies tun, müssen weitere 95% nichts Wesentliches oder At ändern alle. (Ich würde wetten, dass 10% der 1%, die wissen, dass Shells existieren, etwas anderes tun müssen, als ein paar Zeilen in ihre .dot-Dateien zu portieren)

Ihre Eingabeaufforderung ändert sich. Wenn Sie Ihre Eingabeaufforderung in bash geändert haben, ist die Möglichkeit, sie in zsh zu ändern, nicht schwieriger und nicht weniger dokumentiert als Bash.

Die neueren Granaten würden niemals vom Boden abheben, wenn sie wichtige Gegenstände zerbrechen oder eine schmerzhafte Anpassungsphase verursachen würden. Wenn Sie eine grundlegendere Änderung wünschen und wirklich eine Muschel wollen, über die Sie nachdenken müssen und die Schulung und Absicht zur Übernahme erfordert, versuchen Sie es mit fish .

Kommentare

  • Ich habe einen Konflikt mit fish. Ich benutze es jetzt seit zwei Jahren, aber die Inkompatibilität einiger kopierter / eingefügter einzeiliger Zeilen ist anstrengend. Andererseits ist es eine sehr praktische Shell (die automatischen Vorschläge ohne < kbd > Tab < / kbd > sind ausgezeichnet)
  • Ich wollte Fisch lieben, ich möchte immer noch Fisch lieben, aber ich habe zu viele Muschelkonstrukte aus einem Jahrzehnt in ksh, um diese Falte jemals wirklich zu verlassen. Ich lasse Bash gerne zurück und umarme zsh jetzt persönlich.
  • Ich bin von Fischen völlig überwältigt. Es ist wirklich nur eine weitere Unix-ähnliche Shell mit etwas weniger Cruft. (Es heißt wörtlich “ Schließlich eine Befehlszeilen-Shell für die 90er Jahre “ auf der Homepage.) Die einzige neue Shell, die das tut Ich habe in den letzten Jahren gesehen, dass PowerShell, das leider viel zu lange auf Windows beschränkt war und immer noch auf .NET beschränkt ist, tatsächlich etwas Neues auf den (Mainstream-) Tisch gebracht hat. Es gibt immer noch nicht so viel Neues in PowerShell, das ‚ noch nicht durchgeführt wurde, z. in DCL oder JCL, aber es wurde auf (etwas) geschmackvolle Weise gemacht.
  • @bmike Warum nicht einfach ksh verwenden? Apple liefert die aktuellste Version aus. Ich selbst habe vor langer Zeit auf bash gestoßen und sehe keinen Grund, jetzt mit zsh zu beginnen.
  • Diese Antwort beschreibt die Unterschiede zwischen bash und zsh jedoch überhaupt nicht ‚ … und ich ‚ bin mir nicht ganz sicher, warum “ 95% der macOS-Benutzer ‚ Befehlszeile nicht verwenden “ ist relevant für eine Frage eines Benutzers, der offensichtlich bash verwendet.

Antwort

Meine Shell-Skripte sind wirklich nicht so kompliziert

Haben Ihre Shell-Skripte Shebang-Zeilen (beginnen Sie mit #! /bin/bash oder ähnlichem)? Wenn nicht, haben Sie möglicherweise unbeabsichtigt eine Bash-Funktion verwendet, bei der Skripte ohne Shebang mit Bash ausgeführt werden. Andere Shells wie dash oder zsh überlassen es dem Betriebssystem, das normalerweise stattdessen /bin/sh verwendet. /bin/sh unter macOS ist und bleibt wahrscheinlich eine Kopie von /bin/bash, führt jedoch bash mit dem Namen bewirkt ein anderes Verhalten. Die Einzelheiten sind das Bash-Handbuch 6.11 Bash POSIX-Modus . Einige Punkte:

  1. Bash stellt sicher, dass die Variable POSIXLY_CORRECT gesetzt ist.

Diese Umgebungsvariable kann das Verhalten einer Reihe anderer Tools beeinflussen, insbesondere wenn GNU-Tools installiert sind.

  1. Prozessersetzung ist nicht verfügbar.

Die Prozessersetzung ist die Syntax <(...) oder >(...).

  1. Die integrierten Funktionen . und source durchsuchen das aktuelle Verzeichnis nicht nach dem Dateinamen Argument, wenn es nicht durch Suchen von PATH gefunden wird.

Wenn Ihr Skript also . foo ausgeführt hat Erwarten Sie, dass eine Datei mit dem Namen foo im aktuellen Verzeichnis erstellt wird, die nicht funktioniert. Sie sollten stattdessen . ./foo ausführen.

Wie Sie anhand der Zahlen erraten können, gibt es im POSIX-Modus viele geringfügige Unterschiede im Verhalten von Bash. Verwenden Sie am besten einen Shebang, wenn Sie Bash für Ihre Skripte verwenden möchten.

Kommentare

  • Bei der Überprüfung sieht es so aus, als ob die überwiegende Mehrheit der Shell-Skripte, die ich geschrieben habe e oder verwenden Sie entweder explizit state / bin / bash im shebang (sehr wenige von ihnen) oder state / bin / sh (fast alle von ihnen), so dass zumindest kein Problem auftreten sollte. Vielen Dank.
  • Ich denke, die Prozessersetzung ist jetzt verfügbar. Ich habe es auch erfolgreich auf Catalina versucht. Siehe: zsh.sourceforge.net/Intro/intro_7.html
  • @Siu hat immer noch ‚ t Hilfeskripten, die im shebang /bin/sh oder /bin/bash verwenden. Zsh ist nur die interaktive Standard-Shell. ‚ hat Bash nicht überall ersetzt.
  • @muru Ah, ich verstehe. Ich habe die Antwort nicht sorgfältig gelesen und dachte, dass der Autor über die Prozessersetzung sprach, die in der Antwort zsh 😅

nicht verfügbar ist

Um die Dinge einfach zu halten …

Kann jemand ein einfaches Praktikum anbieten? Vergleich oder bestimmte Stolpersteine, die ich wissen muss, damit ich bei der Veröffentlichung von Catalina darauf hinarbeiten kann, bereit für die neue Shell zu sein?

If Wenn Sie überlegen, die neue Standard-Shell zu verwenden, sollten Sie Folgendes berücksichtigen:

  • Wenn Sie Zsh einen Wirbel geben und einige der Unterschiede spüren möchten, ohne die Shell-Einstellungen auf Ihrem Computer zu ändern Versuchen Sie es mit Powerline10k in einem Docker-Container und prüfen Sie, ob es sich um Ihre Tasse Tee handelt.
  • Wenn Sie nicht alle Glocken und benötigen pfeift und verwendet Bash nur für einfache Skripte. Es ist ziemlich einfach, Ihre Shell so einzustellen, wie andere hier erklärt haben. Und wenn Sie sich entscheiden Ich möchte -Funktionen in Bash 5 verwenden , es ist ein ziemlich triviales Upgrade für macOS .
  • Wenn Sie die Portabilität Ihrer Skripte verbessern möchten, damit sie in beiden Shells mit größerer Wahrscheinlichkeit wie erwartet funktionieren, testen Sie sie auf POSIX-Konformität und entfernen Sie alle „Bashismen“. Ich habe dafür ShellCheck verwendet und es funktioniert recht gut für weniger komplizierte Skripte.

Obwohl kein bestimmter Pfad klar ist Diese drei Ansätze sollten Ihnen genügend Vertrauen geben, um eine fundierte Entscheidung zu treffen, ohne das Problem oder den Lösungsraum zu überarbeiten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.