Beste Antwort
Dies sind alles Muscheln, und es gibt viele weitere, die Sie nicht erwähnt haben. Welche Sie verwenden, hängt von Ihren persönlichen Vorlieben ab.
Die erste Shell war die Bourne Shell (oder sh) und war es auch die Standardeinstellung unter Unix für eine lange Zeit. Dann kam eine wichtige Ableitung in Unix und eine neue Shell wurde von Grund auf neu erstellt, die C-Shell (oder csh). Der alternden Bourne Shell folgte dann die kompatible, aber viel leistungsfähigere Korn Shell (oder ksh). Die verfügbaren Shells fallen im Allgemeinen in eine dieser Kategorien: Bourne / Korn Shell-Derivat (bash), C Shell-Derivat oder Klon (tcsh) oder „other“ (wie zsh).
Es gibt viele Shells Wählen Sie aus und nicht nur die, die Sie erwähnt haben. GNU Bash fällt in das Bourne / Korn Shell-Lager und ist heute die Standard-Shell für eine Vielzahl von Unix- und Linux-Varianten. Wenn Sie ein Shell-Terminal unter Unix oder Linux verwendet haben, war es wahrscheinlich dieses. Wenn Sie Bourne Shell (sh) wirklich und wirklich wollen, glaube ich, dass es jetzt kostenlos verfügbar ist – aber es wird im Allgemeinen gemieden, weil es nicht genügend Funktionen hat. Die Korn Shell ist abwärtskompatibel und auch in Form von Klonen (mksh) und dem kürzlich veröffentlichten Original (ksh) kostenlos.
Für C Shell gibt es tcsh, einen erweiterten Klon des ursprünglichen csh Es gibt weniger csh-Klone, da csh nicht als ein Weg nach vorne angesehen wurde und nicht so viele Benutzer hat. Viele BSD-Versionen von Unix (wie FreeBSD und andere) verwenden jedoch csh als Standard-Shell.
Es gibt Varianten, die weder mit sh / ksh noch mit csh kompatibel sind – aber es handelt sich in der Regel um Nischenschalen. Meine Favoriten in diesem Bereich wären die Scheme Shell (scsh) und die Plan 9 Shell rc – aber diese werden unter Unix oder Linux nie standardmäßig installiert und die erstere ist ziemlich groß. zsh fällt ebenfalls in diese „andere“ Kategorie.
Meine Empfehlung ist dreifach: Probieren Sie zuerst die Standard-Shell auf Ihrem System aus – mit ziemlicher Sicherheit GNU-Bash. Bash ist überall und liest und führt Bourne Shell- und Korn Shell-Programme ohne Inkompatibilitäten aus. Zweitens probieren Sie jede der Shells aus, die Sie wirklich ausprobieren möchten (z. B. zsh oder tcsh), und arbeiten Sie eine Weile damit, um festzustellen, ob sie Ihren Anforderungen entspricht. Verwenden Sie zum Schluss einfach das, was Ihnen gefällt.
Beachten Sie, dass Sie nicht Skripte in die von Ihnen verwendete Shell schreiben müssen: Ich habe die C-Shell interaktiv verwendet, mich aber geweigert, sie zu programmieren (alle meine Skripte verwendeten die Korn-Shell). Schließlich habe ich eines Tages den Sprung in ksh gewagt und habe nie zurückgeschaut.
Meine persönlichen Favoriten Punkt sind mksh (ein Korn Shell-Klon ohne Erweiterungen) – oder GNU-Bash mit vollständiger Korn Shell-Kompatibilität – oder rc , die Shell des neuen Plan 9-Betriebssystems, die eigentlich ein Unix-Nachfolger sein sollte (obwohl dies nicht eingetreten ist).
Antwort
Besser für was?
Was sind Ihre Kriterien?
Persönlich schlage ich bash vor, da dies die Standardeinstellung auf Linux- und MacOS X-Systemen und ist Verfügbar unter allen anderen Unix-Formen und unter MS Windows über Cygwin und ist die Standardeinstellung für die Microsoft ™ Windows-Dienste für Linux ” (Ubuntu bash Support-Schicht / Subsystem).
Grundsätzlich ist dies der Weg des geringsten Widerstands, wenn Sie über viele Jahre hinweg viele verschiedene Systeme betreiben möchten… und häufig auf frisch neu abgebildete Systeme oder neu gestartete Instanzen mit minimalen Abweichungen von der Betriebssystembasis zugreifen (as ist üblich für skalierte Web- / App-Serverfarmen). Es ist nah genug an Korn Shell, dass nur wenige Leute die Eckfälle finden, in denen sie sich in der Semantik unterscheiden. (Die meisten Benutzer werden den Unterschied zwischen minimaleren Bourne-Shell-Klonen wie ash und dash und die Funktionen, die bash hinzufügt, können noch weniger zwischen den Unterschieden zwischen ksh und bash .
zsh ist wahrscheinlich die mächtigste und anpassbar. Es ist am besten für jemanden geeignet, der wirklich leidenschaftlich daran interessiert ist, seine Shell zu verwenden und anzupassen. Der Nachteil der Verwendung… mit all ihren Verbesserungen und Anpassungen… ist, dass der Benutzer es wahrscheinlich frustrierend findet, auf die Verwendung einer anderen Shell zurückzugreifen, wenn Debugging-Probleme auf Systemen, auf denen zsh (noch) nicht installiert wurde – was die Leute von ops / sysadmins in modernen Umgebungen ziemlich häufig tun.Es ist auch ziemlich unhandlich, wenn Sie mit Kollegen arbeiten oder sie betreuen und versuchen, ihnen etwas an ihrer Shell-Eingabeaufforderung zu zeigen oder einen GNU-Bildschirm oder tmux Sitzung mit ihnen.
Die Korn-Shell ksh ist eine bessere Shell für Skripte als bash in ein paar kleinen Details … aber nicht genug, um es überall abrufen, installieren und konfigurieren zu müssen.
ksh unterstützte viele Jahre lang „assoziative Arrays“ (Hash / Wörterbücher), bevor bash es hinzufügte. (Es wurde erst vor einigen Jahren zu bash hinzugefügt und ist beispielsweise in den Versionen, die standardmäßig mit MacOS X geliefert werden, immer noch nicht enthalten.) Daher ist es normalerweise am besten, einfach keine assoziativen Arrays in Ihren Shell-Skripten zu verwenden. Wenn Sie glauben, dass Sie seine Funktionen nutzen möchten, ist es normalerweise am besten, zu Python, Ruby, Perl, TCL / wünschen oder einer Reihe anderer allgemeiner Skriptsprachen zu wechseln . Es gibt einfach nicht so viel zu gewinnen, wenn Sie nur für diese eine Funktion zu einer anderen Shell wechseln (in Bezug auf den Betriebsaufwand).
Dasselbe gilt für ksh Coprozesse .
Der einzige andere bemerkenswerte Unterschied ist einer, der erklärt werden muss. Betrachten Sie den folgenden Shell-Befehl:
unset foo; echo bar | read foo; echo "$foo"
Dies gilt in jeder Bourne-kompatiblen Shell. Aber es wird sich unter verschiedenen Schalen unterschiedlich verhalten. Es wird entweder die Zeichenfolge „bar“ (und eine neue Zeile) oder nur die leere Zeile ausgegeben.
bash reicht aus Letzteres wird ausgeführt, während ksh und zsh auf die erstere Weise ausgeführt werden. Die Shell-Variable „foo“ wird in der aktuellen Shell festgelegt. Meiner Meinung nach ist dies die bevorzugte Semantik.
Dies ist jedoch ein Eckfall. Soweit ich weiß, wird dies nicht durch die Posix-Spezifikationen für die Unix-Shell abgedeckt. Die Tatsache, dass das Verhalten implementierungsabhängig ist, ist also kein Fehler. Dies ist lediglich etwas, das ein Experte in der Shell kennen und entweder testen oder umgehen muss.
Der Grund für dieses Verhalten ist, dass der „Pipe“ -Operator in der Shell eine Kommunikation zwischen Prozessen ist Mechanismus. Die Shell muss eine Unterschale erstellen, dh einen Unterprozess, der eine eigene Kopie des Speichers des übergeordneten Prozesses ausführt. Jede Implementierung kann jedoch den Befehl analysieren und entweder den Teil vor (links von) dem Pipe-Symbol in der Subshell ausführen (wie von ksh und zsh ) oder nach (rechts von) der Pipe (wie durch bash, sehr alte Versionen von ksh (vor der Veröffentlichung von 1983?) und der älteren Bourne-Shell und den meisten anderen von seinen Klonen wie ash und dash .
Eine Arbeit In der Umgebung wird die Befehlsgruppierung verwendet, um sicherzustellen, dass alle Befehle nach der Pipe „im Gültigkeitsbereich“ sind und die read wie folgt integriert ist:
unset foo; echo bar | { read foo; echo "$foo"; }
(In diesem Beispiel wird übrigens ein subtiler Fehler angezeigt, der in bash vor 1.4 und danach behoben, der Parser zur Behandlung von {} Zeichen und Token ve sehr ähnlich wie die () (Klammern). So wurde es früher toleriert, dieses Semikolon nach meinem Echo „$ foo“ wegzulassen – was technisch gesehen eine Abweichung von der Spezifikation war. Das Problem ist, dass Millionen von Menschen bash verwendeten und Skripte schrieben, basierend auf der Annahme, dass sie ihren Befehl nicht vor einer schließenden Klammer beenden mussten – mit a Semikolon oder eine neue Zeile. Einige dieser alten Shell-Skripte weisen diesen Fehler also auch über ein Jahrzehnt später noch auf, und es gibt nur eine Handvoll Leute, die die Shell gut genug kennen, um sie zu erkennen und zu beheben.
Für die interaktive Verwendung gilt: bash ist ksh deutlich überlegen, aber wahrscheinlich nicht ganz auf dem Niveau von zsh für alle, die sich zum Erlernen und Verwenden äußerst kniffliger Verbesserungen und Anpassungen verpflichten möchten.
bash unterstützt die programmierbare [Tab] -Vervollständigung und die GNU-Readline -Bibliotheken für eine äußerst flexible Steuerung der Tastenkombinationen, der Befehlszeilenbearbeitung und des Zugriffs auf den Befehlsverlauf. ksh hat den relativ begrenzten Befehl fc (der bash unterstützt auch) Ihren „Fix-Befehl“ – das heißt, Sie wählen Elemente aus Ihrem Verlauf aus, rufen sie in Ihrem bevorzugten Texteditor auf und führen den Inhalt dieser bearbeiteten temporären Datei beim Beenden automatisch aus.
Aber bash unterstützt dies und seine eigenen emacs oder vi Verlaufszugriff und -bearbeitung sowie die alte csh ! (Bang) -Operatoren ebenfalls.
bash unterstützt vi Bearbeitung Modus ( setze -o vi ), der, wenn ich mich richtig erinnere, der Standard in ksh 93. Aber bash verwendet standardmäßig den emacs -Modus ( setze -o Emacs ). Zusätzlich kann man natürlich auch den Befehl bash bind verwenden, um einen beliebigen Befehl erneut zu binden Tasten für eine Vielzahl von Bearbeitungs- und Verlaufsmanipulationsfunktionen oder für Makros, die in einen beliebigen Text erweitert werden, den Sie möglicherweise in eine Befehlszeile einfügen möchten.
Zusätzlich bash hat viele „magische“ Umgebungsvariablen, die Dinge tun können, die fast unvorstellbar subtil und kompliziert sind. Beispielsweise können Sie die Variable PROMPT\_COMMAND so einstellen, dass jedes Mal, wenn bash ist, ein benutzerdefinierter Hook ausgeführt wird im Begriff, seine Aufforderung zu präsentieren. Sie können also nach magischen .dot\_file suchen und Ihre laufende Shell basierend auf dem Verzeichnis, in dem Sie sich befinden, neu anpassen oder die Farben Ihrer Eingabeaufforderungszeichenfolge und des Terminalbildschirms zurücksetzen basierend auf der Tageszeit oder fragen Sie eine Website ab und führen Sie automatisch einen Befehl aus, der auf… fast allem basiert.
(Ich habe diesen Hook verwendet, um virtuelle Python-Umgebungen automatisch zu aktivieren, indem ich einfach in ihr Arbeitsverzeichnis wechsle Beispiel:
Wenn Sie tcsh (oder seinen Vorfahren, csh
Die Fisch Shell ist ebenfalls eine Nische. Ich habe es nie genug benutzt, um mir eine Meinung darüber zu bilden, und es ist auf jeden Fall bunt genug. Aber ich denke, es wird eine sehr schwierige Angelegenheit sein, bevor es eine wirklich weit verbreitete Anhängerschaft schafft. Sofern Apple ™ es nicht als Standard-Shell für seine Mac ™ -Systeme ausliefert, ist es wahrscheinlich dazu verdammt, auf absehbare Zeit in seiner Nische zu bleiben.
Ich hoffe, ich habe den Punkt klargestellt. Es macht wirklich nicht viel Sinn zu fragen, was das Beste ist … (von so ziemlich allem, wo es vernünftige Alternativen gibt).
Bei Unix-Befehlsshells sind die Unterschiede zwischen den Bourne-kompatiblen Shells so gering, dass nur Experten sie auseinanderhalten können, und diese haben Kompromisse und laufen schließlich auf eher subjektive Vorlieben hinaus. Ich habe Kollegen, die leidenschaftlich für ihre zsh -Einstellungen sind, und andere, die sich nur um sie kümmern. Ich bin irgendwo dazwischen und habe mich an die am leichtesten verfügbare Wahl angepasst.