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 Applebash
für alles “ wichtige “ auf dem System?
Antwort
Zunächst einige wichtige Dinge:
- 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.
- 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. - 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:
- Die „alter“ Vervollständigungsmechanismus mit
compctl
, den Sie vergessen können. - Die “ neuer „Abschlussmechanismus mit
compadd
und viele Funktionen, die mit Unterstrichund eine leistungsstarke, aber komplexe Benutzerkonfigurationsmechanismen . - Eine -Emulation an Unterstützt Bash-Vervollständigungsfunktionen , die Sie aktivieren können, indem Sie
bashcompinit
ausführen. Die Emulation ist nicht 100% perfekt, funktioniert aber normalerweise.
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 mitfoo*
und symbolische Links zu regulären Dateien, nicht zu Verzeichnissen und anderen speziellen Dateien. -
foo*(*.)
: Nur ausführbare reguläre Dateien, die mitfoo*
. -
foo*(-.)
: Nur reguläre Dateien, die mitfoo*
übereinstimmen, keine symbolischen Links und andere spezielle Dateien. -
foo*(-@)
: Nur baumelnde symbolische Links, die mitfoo*
übereinstimmen. -
foo*(om)
: Die Dateien, die mitfoo*
übereinstimmen, sortiert nach dem letzten Änderungsdatum, dem letzten zuerst. Beachten Sie dies, wenn Sie dies anls
, es wird seine eigene Sortierung durchführen. Dies ist besonders nützlich in… -
foo*(om[1,10])
: Die 10 neuesten Dateien, die mitfoo*
übereinstimmen, die neueste zuerst. -
foo*(Lm+1)
: Dateien, die mitfoo*
übereinstimmen und deren Größe mindestens 1 MB beträgt. -
foo*(N)
: Wiefoo*
, aber wenn dies mit keiner Datei übereinstimmt, erstellen Sie trotzdem eine leere Liste der Einstellung der Optionnull_glob
(siehe oben). -
*(D)
: Alle Dateien einschließlich Punktdateien abgleichen ( außer.
und..
). -
foo/bar/*(:t)
(unter Verwendung von a Verlaufsmodifikator ): Die Dateien infoo/bar
, jedoch nur mit dem Basisnamen der Datei afoo/bar/qux.txt
wird alsqux.txt
erweitert. -
foo/bar/*(.:r)
: Nehmen Sie reguläre Dateien unterfoo/bar
und entfernen Sie die Erweiterung. Z.B.foo/bar/qux.txt
wird alsfoo/bar/qux
erweitert. -
foo*.odt(e\""REPLY=$REPLY:r.pdf"\")
: Nehmen Sie die Liste der Dateien, die mitfoo*.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 mitfoo
beginnt, jedoch nicht mitfoobar
. -
image<->.jpg(n)
: alle.jpg
-Dateien, deren Basisnameimage
ist, gefolgt von einer Zahl, zimage3.jpg
undimage22.jpg
, jedoch nichtimage-backup.jpg
. Das glob-Qualifikationsmerkmal(n)
bewirkt, dass die Dateien in numerischer Reihenfolge aufgelistet werden, dhimage9.jpg
steht vorimage10.jpg
(Sie können dies auch ohne-n
mitsetopt 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
- Alle Skripte, die von
bash
Die Syntax findet und ruft immer noch bash auf. - Die gleiche Bash von Mojave wird auf Catalina ausgeliefert, und migrierte Benutzer behalten ihre alte Shell.
- Viele Blogs bieten großartige Informationen zum Verschieben von Einstellungsdateien – hier eine davon – https://scriptingosx.com/2019/06/moving-to-zsh-part-2-configuration-files/
- Armin verwandelte seine Blogserie in ein richtiges Buch mit etwa 22.000 Wörtern.
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:
- 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.
- Prozessersetzung ist nicht verfügbar.
Die Prozessersetzung ist die Syntax <(...)
oder >(...)
.
- Die integrierten Funktionen
.
undsource
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.