Gibt es einen Grund, bash über zsh zu verwenden? [geschlossen]

33

Ich bin gespannt, warum man Bash anstelle von Zsh ausführen möchte. Ich meine, zsh ist vollständig abwärtskompatibel mit bash. Versteht mich nicht falsch: Ich mag keine Schläge oder ähnliches. Ich möchte nur wirklich wissen, ob die Verwendung gegenüber zsh irgendwelche Vorteile hat.

Welchen Grund gibt es also, bash über zsh zu verwenden?

Jason Baker
quelle
2
Ich wollte nur darauf hinweisen, dass ZSH nicht vollständig abwärtskompatibel mit BASH ist. In ZSH beginnt die Array-Indizierung bei 1 - in BASH beginnt die Array-Indizierung bei 0. Es gibt auch andere Unterschiede, aber ich wollte darauf hinweisen.
Charles Addis

Antworten:

29

Zwei Gründe kommen in den Sinn:

Erstens - es ist praktisch überall verfügbar. Ich habe mehrere Linux-Systeme (in diesem Fall CentOS 4.x), auf denen zsh nicht installiert ist. Ebenso muss ich alte Systeme wie Solaris 2.6 und höher, HP-UX 10 und höher und ähnlich knarrende Versionen von AIX berühren. Deshalb muss ich bash auf diesen Computern so ziemlich verwenden, was ich tue, weil ich im Laufe eines Monats Dutzende, wenn nicht sogar Hunderte einzelner Computer berühre Standardeinstellungen.

Zweitens - es ist praktisch überall verfügbar. Dies bedeutet, dass ich ein Bash-Shell-Skript schreiben kann und zu 99% sicher bin, dass es funktioniert, wenn es an einen anderen Ort übertragen wird.

Ja, diese Gründe sind oberflächlich gleich, aber die Gründe dafür sind unterschiedlich.

David Mackintosh
quelle
2
Ich erinnere mich, dass wir ksh88 / ksh93 unter HPUX hatten und nie Zugriff darauf hatten, bash zu installieren.
Zlemini
24

Bash wird im Allgemeinen mit jedem System geliefert, zsh nicht. Ich liebe zsh, aber aus diesem Grund benutze ich zsh für die interaktive Verwendung, aber Bash für alle meine Skripte .

Ich finde, dass dies alles einfacher hält, da ich selbst dann subtile Unterschiede feststelle, wenn ich die bash-kompatiblen Optionen (setopt SH_WORD_SPLIT?) Auswähle.

Kyle Brandt
quelle
3
Das wäre jedes GNU / Linux-System, das Sie meinen?
Andol
2
Nun, ich habe herausgefunden, dass es mit OS / X und BSD kommt. Ich habe nicht viel Erfahrung mit anderen * nix, haben sie (neuere Versionen) normalerweise keine Bash?
Kyle Brandt
1
Ältere Solaris-Versionen enthielten keine Bash. Normalerweise musste ich mich darauf verlassen, dass Bourne die Shell für die Skripterstellung ist. Dies ist schon eine Weile nicht mehr der Fall, aber in einigen großen Unternehmen kann es dennoch vorkommen, dass Sie darauf stoßen.
user5336
3
Muss anders gewesen sein BSD: s dann. Zumindest in OpenBSD und FreeBSD müssen Sie bash getrennt von ports / packages installieren.
Andol
andol: Das sind die, die ich benutzt habe. Ich muss mich falsch erinnern, oder ich habe das getan und erinnere mich einfach nicht.
Kyle Brandt
13

zsh ist nicht vollständig bash-kompatibel. Es gibt verschiedene Unterschiede. Neuere zsh-Versionen sind besser mit bash kompatibel (= ~ unterstützt, exec verfügt jetzt über zusätzliche Flag-Optionen usw.), die vollständige Kompatibilität ist jedoch kein Ziel, auch nicht unter "emulieren".

Zum Beispiel ist bash substring $ {foo: offset: len}, aber in zsh ist es $ foo [start, end] und das ist nur ein einfaches Beispiel.

zsh ist eine von tcsh und ksh beeinflusste Shell, die vieles auf ihre eigene Weise tut. POSIX-Kompatibilität ist ausdrücklich kein Ziel, aber die Entwickler reagieren auf Patches, die Optionen hinzufügen oder Verhaltensweisen emulieren, die die Dinge näher an POSIX bringen. Aber wenn Sie sich wirklich mit der Leistungsfähigkeit der Shell befassen, erstellen Sie Skripte, die nur zum Schreiben bestimmt sind, mehr noch als Bash.

bash ist POSIX sh + ksh + pedanticism, wobei einige Funktionen jetzt aus zsh kopiert wurden. Es gibt auch schreibgeschützte Skripte, aber da es weniger leistungsstarke Operatoren hat, wird die Prägnanz von zsh möglicherweise nicht verwendet und die Dinge sind besser lesbar (mit Ausnahme aller Anführungszeichen, um die Aufteilung von Leerzeichen zu vermeiden, bedeutet das blöde $ -Array im ksh-Stil zuerst -Element-of-Array, nicht alle-Elemente-of-Array, etc etc).

Das Schreiben von Skripten, die die Leistung einer der beiden Shells voll ausnutzen, ist unklug, es sei denn, Sie befinden sich in einer eingeschränkten Umgebung (z. B. Schreiben von System-RC-Skripten, in denen einige FSs möglicherweise nicht bereitgestellt werden usw.). Verwenden Sie im Idealfall Perl / Python / Ruby / whatever für alles, was groß genug ist, um die Ausdruckskraft zu benötigen, die nicht in Bourne sh enthalten ist, wenn andere es beibehalten sollen. Behalten Sie das Shell-Zeug für Dinge, die sich auf die interaktive Shell beziehen (Tab-Vervollständigungsprogrammierung usw.).

Ich würde bash nicht über zsh verwenden. Ich würde für einfache Skripte Bare-Sh-over-Zsh verwenden oder zu einer Sprache wechseln, in der assoziative Arrays anständige Operatoren haben (anders als in Zsh, wo sie wiederum "prägnant" sind). Ich könnte ein sh-Skript auf bash umstellen, wenn ich diese kleine Funktion benötige, um ein vorhandenes, bewährtes Skript zu erweitern, und keine Zeit habe, es jetzt umzuschreiben.

Phil P
quelle
6
nb: $ {foo: offset: len} wird jetzt aus Kompatibilitätsgründen in zsh unterstützt.
Phil P
6

Mein Rat: Wenn Sie absolute Portabilität anstreben, schreiben Sie mit Bourne-Shell-Regeln, und kümmern Sie sich nicht einmal um Korn-Shell-Erweiterungen. Wie bereits erwähnt, sind das einige ältere "große Kisten", die überhaupt keine GNU-Shells haben.

Bash macht schon "zu viel". Ich habe einen Freund bei der Arbeit, der Zsh bevorzugt, aber ich weiß nicht genau, was es tut.

Wie auch immer, schreiben Sie entweder für die Bourne-Shell (oder "bourne again") oder alternativ, wenn Sie ein benutzerdefiniertes Skript für eine kleine Anzahl bestimmter Boxen ausführen, überspringen Sie die "Shell Hell" vollständig und schreiben Sie einfach mit Perl oder Python (oder was auch immer) Ihr bevorzugter lokal installierter Interpreter ist).

Roboprog
quelle
5

Zusätzlich zu dem oben genannten Portabilitätsgrund könnte ein weiterer Grund sein, dass bash immer noch Funktionen hinzufügt.

Zum Beispiel bash v4.x + eingeführt:

  • rekursives Globbing:

    rm -f ** / *. log

  • autocd:

    Geben Sie "/ tmp" anstelle von "cd / tmp" ein

Kavalkade
quelle
2
Wie ist das Kopieren von Features aus zsh in Bash ein Grund, Bash zu verwenden?
qqx
5

Übrigens wurde Ihnen hier oft gesagt, dass bash praktisch überall zu finden ist. Verwenden Sie es also, um tragbare Skripte zu schreiben, was falsch ist.

Unsinn. Wenn Sie wissen, dass jedes System, das Sie interessiert, über BASH verfügt, ist dies eine absolut vernünftige Aussage. BASH bietet viele nützliche Funktionen, die in POSIX sh nicht sinnvoll emuliert werden können. Die frivole Verwendung von Nicht-POSIX-Funktionen ist keine gute Idee, aber die Verwendung, wenn Sie sie wirklich benötigen, ist in Ordnung.

Portabilität ist kein absolutes Muss. Es ist fraglich, wie weit Sie es brauchen, genau wie alles andere. Fedora verwendet zum Beispiel Shell-Befehle zum Erstellen von RPM-Paketen und die Fedora-Verpackungsrichtlinien besagen, dass es in Ordnung ist, alle Funktionen von BASH zu verwenden, da alle Pakete nativ auf Fedora erstellt werden müssen. Auch wenn theoretisch andere Distributionen ohne BASH ihre Quell-RPMs wiederverwenden möchten, haben sie sich aufgrund der praktischen Anwendbarkeit für die Portabilität entschieden und nicht für Ihr Mantra "IMMER UZE POSIX !! 1".

ZSH hat sich nicht als Standard-Shell durchgesetzt, nur weil es ein riesiges Durcheinander von halbgebackenen Ideen ist.

Craig
quelle
2
Kannst du erklären, welche Funktionen oder Ideen in zsh du für halbherzig hältst und warum?
Funroll
2

Übrigens wurde Ihnen hier oft gesagt, dass bashes praktisch überall zu finden ist. Verwenden Sie es also, um tragbare Skripte zu schreiben, was falsch ist .

Die richtige Art, tragbare Unix-Skripte zu schreiben, ist die Verwendung sh, die in jedem * nix-System zu finden ist .

Jede andere Shell shist nur ein tägliches interaktives Tool von Ihnen.

Wenn es darum geht, bashvs zsh- bashin mehr *nixesals gebündelt zu bekommen zsh, gibt es hier die Nachteile der Installation zusätzlicher Software auf dem System - Sie müssen sie warten. Einige Leute lieben zsh "coole Features", also zahlen sie diesen Preis gern, andere nicht.

Samat
quelle
2
Viele moderne Implementierungen von sh sind nur Links zu bash.
user9517 unterstützt GoFundMonica 21.08.12
2
@Iain Ubuntu verwendet standardmäßig dash und aktiviert shden Kompatibilitätsmodus, wenn es als ausgeführt wird , auch wenn es sich um bash handelt sh.
mgorven
2

Ein weiterer Punkt:

Viele Programme bieten standardmäßig eine coole Bash-Vervollständigung. Für mich ist es der Grund, nicht zu wechseln.

[hinzugefügt im Juli 2013] Nun, nachdem ich seit dem obigen Kommentar einige Jahre lang zsh verwendet habe, muss ich sagen, dass die Tab-Vervollständigung (sogar die eingebaute ohne Modifikationen der 3. Parität) brillant ist und weit über die von bash angebotene hinausgeht . :).

Wojciech Kaczmarek
quelle
3
Ich denke, dass das auch mit ZSH funktioniert. Mit der Tab-Vervollständigung in ZSH bekomme ich viele programmspezifische Argumente ...
Kyle Brandt
Interessant. Wollen Sie damit sagen, dass Bash-Vervollständigungsdateien mit zsh funktionieren, oder dass nur einige Programme ihre zsh-spezifischen Vervollständigungsdateien haben? Trotzdem gibt es ein Standardlayout für Bash-Completion-Dateien, das zsh möglicherweise nicht automatisch berücksichtigt. Hast du deine zsh-Konfiguration angepasst, damit es funktioniert?
Wojciech Kaczmarek
@Wojciech Kaczmarek: Ich denke, Sie möchten den 19.3 von folgendem: zsh.sourceforge.net/Doc/Release/zsh_19.html . Ehrlich gesagt, ich habe nie die Zeit , um wirklich zu verstehen, nur abgezockt einer .zshrc fand ich online :-) Aber es wird Kommandozeilenargumente von Programmen wie apt vervollständigen, grep, etc ....
Kyle Brandt
5
Die Tab-Vervollständigung von bash ist dem alten Tab-Vervollständigungssystem von zsh sehr ähnlich. Dies ist eine der Ideen, die von zsh nach bash kopiert wurden (es gibt andere, die bash nach zsh kopiert haben). Sie können Abschlussskripte verwenden, die für bash in zsh geschrieben wurden, indem Sie "bashcompinit" ausführen und dann die Befehle "complete" und / oder "compgen" in zsh verwenden. Dies ist möglich, weil die bash-Funktionalität eine Teilmenge der in zsh und verfügbaren Funktionalität ist so kann emuliert werden. Es gibt also keinen Grund, auf Bash umzusteigen, da ein Befehl mit einer Bash-Vervollständigung ausgeliefert wird.
Phil P