Was sind die grundlegenden Unterschiede zwischen den Mainstream * NIX-Shells? [geschlossen]


52

Was sind die grundlegenden Unterschiede zwischen den Mainstream * NIX-Shells und welche Szenarien könnten Sie dazu veranlassen, diese übereinander zu verwenden? Ich verstehe, dass ein Teil davon wahrscheinlich auf die Vorlieben der Benutzer zurückzuführen ist, aber ich habe bisher nur Bash verwendet und bin gespannt, wo eine andere Shell nützlich sein könnte.

Hat dies auch Auswirkungen auf vom Benutzer geschriebene Shell-Skripte, wenn sie unter der einen oder anderen Shell ausgeführt werden, oder handelt es sich lediglich um eine Änderung der Shell oben in der Datei? Mein Instinkt sagt, dass es nicht so einfach ist.

Antworten:


52

Für die interaktive Nutzung gibt es zwei Hauptkonkurrenten, bash und zsh , sowie den Straggler tcsh und den Newcomer fish .

  • Bash ist die offizielle Shell des GNU-Projekts und die Standard-Shell der meisten Linux-Distributionen. Bei anderen Unices, die nicht mit einer anständigen interaktiven Shell als Teil der Basisinstallation geliefert werden, ist Bash meiner Meinung nach das, was die Leute in einer Selbstverstärkungsschleife wählen. Siehe auch Warum ist Bash überall? (mit vielen historischen Informationen).

  • Zsh bietet fast alle Funktionen von bash und viele weitere (nützliche!) Funktionen. Der Hauptnachteil ist, dass es weniger bekannt ist, was praktisch bedeutet, dass es weniger wahrscheinlich ist, dass es bereits auf einem System installiert ist, das von einem anderen Benutzer eingerichtet wurde, und dass es weniger Dokumentation von Drittanbietern gibt. Siehe auch Welche zsh-Funktionen verwenden Sie? , Welche Funktionen sind in zsh enthalten und fehlen in der Bash oder umgekehrt? .

  • Tcsh war einst (bis Anfang der 1990er Jahre) die Shell mit den besten interaktiven Funktionen, wie auch der Vorgänger csh. Das machte es populär für die interaktive Verwendung (aber nicht für Skripte ). Zsh hat tcsh eingeholt und sich ziemlich schnell weiter verbessert, und bash hat (mit programmierbarer Vervollständigung) in den frühen 2000er Jahren aufgeholt, während tcsh in den letzten 15 Jahren kaum Fortschritte gemacht hat. Daher gibt es wenig Grund, tcsh jetzt zu lernen.

  • Fisch versucht sauberer zu sein als seine Vorgänger. Es hat einige nette Funktionen (einfachere Syntax, Syntaxfarbe in der Befehlszeile), aber es fehlen andere (was auch immer der Autor nicht mag). Die Fischgemeinschaft ist viel kleiner als die von Zsh, was die Auswirkungen noch verstärkt. Siehe auch Was sind die Unterschiede zwischen Fisch und Fisch? .


Abhängig davon, wie portabel Ihre Skripte sein sollen, sollten Sie für die Skripterstellung mehrere Sprachen auswählen.

  • Alles, was vorgibt, Unix-ähnlich zu sein, hat eine Bourne- abgeleitete Shell als /bin/sh. Es gibt immer noch einige kommerzielle Unices, bei denen /bin/shkeine POSIX- Kompatibilität besteht.

  • Fast jedes shderzeit ausgeführte Unix verfügt über eine ausführbare Datei, die mindestens POSIX.2-1992 und in der Regel mindestens POSIX: 2001 (auch bekannt als Single Unix v3) entspricht . Diese Shell befindet sich möglicherweise in einem anderen Verzeichnis wie /usr/bin/posixoder /usr/xpg6/bin. POSIX-Emulationsebenen gibt es auch für nahezu jedes System, das leistungsfähig genug ist, um es zu unterstützen, was es zu einem attraktiven Ziel macht.

  • Viele Unix - Systeme haben ksh93 , die einige sehr nützliche Features bringt die POSIX sh fehlt (Arrays, assoziative Arrays, erweiterte Klackse ( *(foo), @(foo|bar), ...), null Klackse ( ~(N)foo*), ...). Ksh war ursprünglich kommerzielle Software (sie wurde 2000 frei, nachdem sich einige Gewohnheiten eingestellt hatten), und viele freie Unices (Linux, * BSD) gewöhnten sich an, nur einen viel älteren freien Klon ( pdksh ) bereitzustellen , dem viele dieser nützlichen Funktionen fehlten . Pdksh wird jetzt von mksh außerhalb von OpenBSD verdrängt , aber selbst mksh ist nicht in der Lage, alle ksh93-Funktionen zu implementieren. Heutzutage kann man sich nicht darauf verlassen, dass ksh93 überall verfügbar ist, insbesondere unter Linux, wo bash die Norm ist.

  • Bash ist immer unter Linux (mit Ausnahme einiger eingebetteter Varianten) und oft auch auf anderen Unices verfügbar. Es hat die meisten nützlichen Funktionen von ksh93, wenn auch manchmal mit einer anderen Syntax.

  • Zsh hat die meisten nützlichen Funktionen von ksh93 und bash. Die Kernsyntax ist sauberer, aber mit Bourne nicht kompatibel. Mit Ausnahme von macOS können Sie nicht davon ausgehen, dass zsh auf einem System verfügbar ist, das Sie nicht installiert haben.

  • Für erweiterte Skripterstellung können Sie sich an Perl oder Python wenden . Diese Sprachen verfügen über ordnungsgemäße Datenstrukturen, anständige Funktionen zur Textmanipulation, anständige Prozesskombinationen und Kommunikationsmechanismen sowie über eine Vielzahl verfügbarer Bibliotheken. Die meisten Unix-Systeme haben sie, entweder mit dem Betriebssystem gebündelt oder vom Administrator installiert (weil es so viele Perl- und Python-Skripte gibt, dass es ein seltenes System ist, das nicht mindestens eines von jedem hat).


4
Für die Skripterstellung ziele ich auf Dash (es sei denn, ich benötige die erweiterten Funktionen von Bash), der über einen minimalen Funktionsumfang verfügt und aus Gründen der maximalen Kompatibilität eine positive Beschwerde darstellt. (Und es ist klein, leicht und schnell)
Hildred

Großartige Dokumentation! Zwei Notizen. Erstens gehört Solaris zu den "kommerziellen Unices, bei denen / bin / sh nicht POSIX-kompatibel ist". Insbesondere wird jsh(was keine Java-Shell ist!) Verwendet , bei der eine variable Substitution wie ${VAR#foo}und fehlt ${VAR%bar}.
Adam Katz

Zweitens tcshist es sehr beliebt bei UNIX-Benutzern, die ihre Tricks vor Mitte der 90er Jahre gelernt haben (was die Einführung von beiden bashund sah zsh), insbesondere bei älteren UNIX + C-Entwicklern, die das Leben mit csh(Erinnerung, das c in cshsteht für die CSprache) begonnen haben , was die Inspiration für die Unterschiede zu Muscheln im Borowski-Stil war). Siehe auch Csh-Programmierung, die als schädlich eingestuft wird. Ich verwende sie häufig für Tipps zu POSIX Deep Magic (zusätzlich zu den Anti-Csh-Argumenten).
Adam Katz

Mac OS X ist niemals "OS / X". (: Und wie ist zsh mit Bourne inkompatibel? (Nun, mit Ausnahme von Dingen wie nicht wortspaltenden variablen Erweiterungen.)
SilverWolf

@seaturtle Nicht wortspaltende Variablenerweiterungen sind der Hauptunterschied, der viele sh-Skripte zum Erliegen bringen würde, wenn Sie versuchen, sie mit zsh auszuführen (es sei denn, Sie führen zsh in einem sh / ksh-Emulationsmodus aus).
Gilles 'SO- hör auf böse zu sein'

27

Es gibt zwei grundlegende Varianten von Shell: sh (z. B. bash) und csh (z. B. tcsh). Bei der interaktiven Verwendung kommt es hauptsächlich darauf an, was Sie gewohnt sind. Ich habe jahrelang csh und dann tcsh verwendet, und es wäre schmerzhaft zu wechseln, nur weil ich es so gewohnt bin. Ich habe auch Bash verwendet und ich glaube nicht, dass es zwingende Gründe für einen Wechsel gibt. Außer vielleicht, wenn der eine oder andere nicht auf Computern verfügbar ist, die Sie regelmäßig verwenden.

Bei der Programmierung unterscheidet sich die Syntax. Sie können nicht nur die Shell ändern, sondern müssen auch die Syntax des Skripts ändern. Für die Skripterstellung möchten Sie sh oder bash verwenden. Die Syntax ist für Skripte viel zugänglicher, wie hier erklärt (danke an Riccardo Murri für den Link. Dies ist eine gute Anleitung für Bash-Skripte.

Wenn Sie sich nicht für eine Shell entschieden haben und einige Skripte schreiben möchten, würde ich bash verwenden, um die Menge der Dinge zu reduzieren, die Sie lernen müssen.


12

Früher, als AT & T UNIX erfand, gab es Bourne Shell, geschrieben von Steve Bourne. Es war ziemlich einfach und es fehlten viele Tools, die wir heutzutage für selbstverständlich halten.

AT & T befand sich nicht wirklich im UNIX-Geschäft, daher übernahm Berkelely zu diesem Zeitpunkt etwas das grundlegende Betriebssystem und nahm einige Änderungen an BSD UNIX vor. Unter vielen Änderungen befand sich eine neue Shell mit dem Namen csh, die viele Verbesserungen gegenüber sh aufwies, einschließlich einer besseren interaktiven Verwendung der Auftragssteuerung und so weiter. Leider entschieden sie, dass die sh-Programmiersyntax nicht funktioniert und erstellten ihre eigenen, (etwas schlecht) kopierten C-Codierungsstile. (Ein klassisches Rant ist http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) Nun gab es also zwei Syntaxen.

Später haben sie CSH verbessert, indem sie die Tab-Vervollständigung und einige andere Dinge hinzugefügt haben. Dies wurde zu tcsh, und wenn Sie CSH verwenden, ist dies wahrscheinlich derjenige, den Sie verwenden.

AT & T entschied, dass es nicht vollständig aus dem UNIX-Geschäft heraus war, und sie haben es auch aufpoliert. David Korn (netter Kerl) hat die Korn-Shell erstellt. Basierend auf der Idee, die Bourne-Shell-Syntax zu erweitern, wurden sowohl für Programmierer als auch für die interaktive Verwendung viele Dinge hinzugefügt. Es gibt tatsächlich einige Versionen, und Sie sehen möglicherweise selten Dinge wie ksh88 und ksh93, die die Varianten bezeichnen.

Dann kamen FSF und das GNU OS. Sie wollten ihr eigenes UNIX-kompatibles Betriebssystem namens Hurd erstellen und wollten eine bessere Shell dafür. Sie riefen nach Bourne Again SHell. Ungefähr zu dieser Zeit kamen POSIX-Regeln hinzu, und sie wollten die POSIX-Shell erstellen. Sie sahen sich um, übernahmen die Syntax der Bourne-Shell und die Verbesserungen der Korn-Shell und stahlen und erweiterten die interaktiven Funktionen von tcsh. Es wurde zur De-facto-Shell unter Linux, ist also weit verbreitet.

Es gibt auch die zsh, die als "ultimative" Shell geschrieben wurde. Es ist auch in der Linux-Welt sehr verbreitet. Es hat die Bash verlängert (und ein bisschen gekreuzt, einige neue Dinge gingen zurück auf die Bash).

Wenn ich eine Muschel auswählen würde, würde ich bash oder zsh auswählen. Bash ist möglicherweise an ein paar Stellen mehr als zsh. zsh ist mächtiger, aber bash hat mir gut getan. Real / bin / sh Die Bourne-Shell gibt es nur aus historischen Gründen. bash hat so ziemlich alles, was ksh zu bieten hat und noch viel mehr. Die Syntax ist sauberer als die von csh oder tcsh und bietet bessere Funktionen als beide.

Das Konvertieren eines Skripts hängt davon ab, von was zu was. Der Bourne-Shell-Stil (sh, ksh, bash, zsh) zum oder vom csh-Stil (csh, tcsh) ist schwierig. Das Wechseln von Alt zu Neu (/ bin / sh => bash, / bin / ksh => zsh) ist einfacher als auf die andere Weise.


Beachten Sie, dass die csh-whynot-Seite im September 1995 geschrieben wurde (überprüfen Sie das Versions-Tag oben). Ich weiß es nicht, aber ich würde erwarten, dass sich in den 18 Jahren seitdem viele Dinge geändert haben.
ein Lebenslauf vom

8

Die beiden Hauptzweige von Shells sind die Bourne-Shell-Derivate (sh, bash, ksh, ash, yash und zsh) und die csh-Derivate (tcsh und ... uhm ... tcsh).

Ich vermute (obwohl ich keine tatsächlichen Zahlen habe), dass bash am häufigsten verwendet wird, es scheint jedoch die Standard-Shell in den meisten Linux-Versionen zu sein.

Die meisten Dinge, die in einem Borowski-Shell-Derivat geschrieben wurden, funktionieren wahrscheinlich auch in anderen. Die meisten in einer Bourne-Shell geschriebenen Dinge müssen wahrscheinlich geändert werden, um unter csh oder tcsh ausgeführt zu werden.

Persönlich habe ich ksh benutzt, als ich angefangen habe, weil es das ist, was auf dem System war, das ich benutzte. Ich benutze jetzt hauptsächlich Bash.


1
fish is a csh inspired shell
hildred

1

Ich habe im Laufe der Zeit zahlreiche Muscheln verwendet. Nicht alles super Fortgeschrittene, aber jede Menge praktisches Sysadmin- und Programmiermaterial, das ausreichend angepasst werden musste.

Ich denke, zsh hat mehr Anpassungsmöglichkeiten, zumindest früher, aber nach einigen Jahren hatte ich genug mit der Stabilität und der Zeichenkodierung. Bash ist absolut stabil, hatte nie ähnliche Probleme und wird überall installiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.