it-swarm-eu.dev

Bash oder KornShell (ksh)?

Ich bin nicht neu in * nix, aber in letzter Zeit habe ich viel Zeit am Prompt verbracht. Meine Frage ist, was sind die Vorteile der Verwendung von KornShell (ksh) oder Bash Shell? Wo liegen die Tücken, wenn man eins über das andere setzt?

Suchen Sie aus der Perspektive eines Benutzers zu verstehen, anstatt nur Skripte zu schreiben.

59
user13158

Bash.

Die verschiedenen UNIX- und Linux-Implementierungen haben verschiedene Implementierungen von ksh auf Source-Ebene, von denen einige echte ksh sind, von denen einige pdksh-Implementierungen sind und von denen einige nur Symlinks zu einer anderen Shell sind, die eine "ksh" -Persönlichkeit hat. Dies kann zu merkwürdigen Unterschieden im Ausführungsverhalten führen.

Zumindest mit bash können Sie sicher sein, dass es sich um eine einzelne Codebasis handelt, und Sie müssen sich nur darum kümmern, welche (normalerweise minimale) Version von bash installiert ist. Nachdem ich mit so ziemlich jedem modernen (und nicht so modernen) UNIX viel gescriptet habe, ist es meiner Erfahrung nach zuverlässiger, mit bash zu programmieren.

46
j.e.hahn

Der Unterschied zwischen Kornshell und Bash ist minimal. Es gibt bestimmte Vorteile, die einer gegenüber dem anderen hat, aber die Unterschiede sind winzig:

  • Mit BASH ist es viel einfacher, eine Eingabeaufforderung festzulegen, die das aktuelle Verzeichnis anzeigt. Dasselbe in Kornshell zu tun, ist hackisch.
  • Kornshell hat assoziative Arrays und BASH nicht. Das letzte Mal, dass ich assoziative Arrays verwendete, war ... Lass mich nachdenken ... Niemals.
  • Kornshell handhabt die Schleifensyntax etwas besser. Normalerweise können Sie einen Wert in einer Kornshell-Schleife festlegen und nach der Schleife verfügbar machen.
  • Bash behandelt das Abrufen von Ausgangscodes aus Rohren auf eine sauberere Weise.
  • Kornshell hat den Befehl print, der viel besser ist als der Befehl echo.
  • Bash hat Tab-Vervollständigungen. In älteren Versionen
  • Kornshell verfügt über den Befehl r history, mit dem ich ältere Befehle schnell erneut ausführen kann.
  • Kornshell hat die Syntax cd old new, Die old durch new in Ihrem Verzeichnis und den dortigen CDs ersetzt. Es ist praktisch, wenn Sie sich in einem Verzeichnis mit dem Namen /foo/bar/barfoo/one/bar/bar/foo/bar Befinden und eine CD mit dem Namen /foo/bar/barfoo/two/bar/bar/foo/bar Benötigen. In Kornshell können Sie einfach cd one two Ausführen und fertig sein. In BASH müssten Sie cd ../../../../../two/bar/bar/foo/bar.

Ich bin ein alter Kornshell-Typ, weil ich in den neunziger Jahren Unix gelernt habe, und das war damals die Shell der Wahl. Ich kann Bash verwenden, aber manchmal bin ich darüber frustriert, weil ich aus Gewohnheit eine kleine Funktion verwende, die Kornshell hat, die BASH nicht hat und die nicht funktioniert. Deshalb habe ich, wann immer möglich, Kornshell als Standard festgelegt.

Ich werde Ihnen jedoch sagen, dass Sie BASH lernen sollen. Bash ist jetzt auf den meisten Unix-Systemen sowie unter Linux implementiert, und es stehen einfach mehr Ressourcen zum Erlernen von BASH und zum Abrufen von Hilfe als in Kornshell zur Verfügung. Wenn Sie in BASH etwas Exotisches tun müssen, können Sie auf Stackoverflow gehen, Ihre Frage posten und Sie werden in ein paar Minuten ein Dutzend Antworten erhalten - und einige von ihnen werden sogar richtig sein !.

Wenn du eine Kornshell-Frage hast und sie auf Stackoverflow postest, musst du warten, bis ein alter Hacker wie ich von seinem Mittagsschlaf aufwacht, bevor du eine Antwort erhältst. Und vergessen Sie, eine Antwort zu bekommen, wenn sie an diesem Tag im Altenheim Pudding servieren.

BASH ist jetzt einfach die Shell der Wahl. Wenn Sie also etwas lernen müssen, sollten Sie auch mit dem, was beliebt ist, mithalten.

122
David W.

Ich bin ein Korn-Shell-Veteran, also weiß, dass ich aus dieser Perspektive spreche.

Ich habe mich jedoch mit Bourne Shell, ksh88 und ksh93 wohlgefühlt, und soweit ich weiß, welche Funktionen in welchen unterstützt werden. (Ich sollte ksh88 hier überspringen, da es nicht mehr weit verbreitet ist.)

Nehmen Sie für die interaktive Verwendung alles mit, was Ihren Anforderungen entspricht. Experiment. Ich mag es, die gleiche Shell für die interaktive Verwendung und zum Programmieren verwenden zu können.

Ich ging von ksh88 auf SVR2 zu tcsh, zu ksh88Sun (was bedeutende Internationalisierungsunterstützung hinzufügte) und zu ksh93. Ich habe es mit Bash versucht und es gehasst, weil es meine Geschichte platt gemacht hat. Dann entdeckte ich shopt -s lithist und alles war gut. (Die Option lithist stellt sicher, dass die Zeilenumbrüche in Ihrem Befehlsverlauf erhalten bleiben.)

Für die Shell-Programmierung würde ich ksh93 ernsthaft empfehlen, wenn Sie eine konsistente Programmiersprache, gute POSIX-Konformität und gute Leistung wünschen, da viele gängige Unix-Befehle als integrierte Funktionen verfügbar sein können.

Wenn Sie Portabilität wünschen, verwenden Sie mindestens beide. Und stellen Sie sicher, dass Sie eine gute Testsuite haben.

Es gibt viele subtile Unterschiede zwischen den Schalen. Betrachten Sie zum Beispiel das Lesen aus einer Pipe:

b=42 && echo one two three four |
    read a b junk && echo $b

Dies führt zu unterschiedlichen Ergebnissen bei unterschiedlichen Schalen. Die Korn-Shell führt Pipelines von hinten nach vorne; Das letzte Element in der Pipeline wird im aktuellen Prozess ausgeführt. Bash hat dieses nützliche Verhalten erst in Version 4.x unterstützt, und selbst dann ist es nicht die Standardeinstellung.

Ein weiteres Beispiel zur Veranschaulichung der Konsistenz: Der Befehl echo selbst, der durch die Aufteilung zwischen BSD und SYSV-Unix überflüssig geworden ist, hat jeweils eine eigene Konvention eingeführt, um keine Zeilenumbrüche (und anderes Verhalten) zu drucken. Das Ergebnis davon ist immer noch in vielen 'configure'-Skripten zu sehen.

Ksh ging das radikal an - und führte den Befehl print ein, der tatsächlich beide Methoden unterstützt (-n Option von BSD und das nachfolgende \c Sonderzeichen aus SYSV)

Für ernsthafte Systemprogrammierungen empfehle ich jedoch etwas anderes als eine Shell wie Python oder Perl. Oder gehen Sie noch einen Schritt weiter und verwenden Sie eine Plattform wie eine Marionette, mit der Sie den Zustand ganzer Systemcluster bei guter Überwachung beobachten und korrigieren können.

Shell-Programmierung ist wie Schwimmen in unbekannten Gewässern oder noch schlimmer.

Das Programmieren in einer beliebigen Sprache erfordert Kenntnis der Syntax, der Benutzeroberflächen und des Verhaltens. Die Shell-Programmierung ist nicht anders.

28
Henk Langeveld

Dies ist ein Kampf zwischen Unix und Linux. Die meisten, wenn nicht alle Linux-Distributionen haben bash installiert und ksh optional. Die meisten Unix-Systeme wie Solaris, AIX und HPUX haben standardmäßig ksh.

Persönlich benutze ich immer ksh, ich liebe die vi-Vervollständigung und ich benutze Solaris so ziemlich für alles.

4
Kristian

Für Skripte verwende ich immer ksh , weil es über gotchas glättet.

Aber ich finde bash komfortabler für die interaktive Verwendung. Für mich sind die emacs Tastenkombinationen und die Tab-Vervollständigung die Hauptvorteile. Aber das ist meistens Gewohnheit, kein technisches Problem mit ksh .

4
Jon Ericson

Ich habe keine Erfahrung mit ksh, aber ich habe sowohl bash als auch zsh verwendet. Ich bevorzuge zsh gegenüber bash, da es sehr leistungsfähige Datei-Globbing-Funktionen, variable Erweiterungsmodifikatoren und eine schnellere Tab-Vervollständigung unterstützt.

Hier ist eine kurze Einführung: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

Meine Antwort wäre: Wähle eine aus und lerne, wie man sie benutzt. Sie sind beide anständige Muscheln; Bash hat wahrscheinlich mehr Schnickschnack, aber beide haben die grundlegenden Funktionen, die Sie wollen. bash ist heutzutage universeller verfügbar. Wenn Sie ständig mit Linux arbeiten, bleiben Sie einfach dabei.

Wenn Sie programmieren, ist es eine gute Praxis, sich für die Portabilität an einfaches "sh" zu halten, aber wenn Bash heutzutage so weit verbreitet ist, ist ein bisschen Rat wahrscheinlich ein bisschen altmodisch.

Erfahren Sie, wie Sie Completion und Ihren Shell-Verlauf verwenden. Lies die Manpage gelegentlich und versuche ein paar neue Dinge zu lernen.

3
Incident

@ Foxxtrot

Tatsächlich ist die Standard-Shell die Bourne-Shell (sh). /bin/sh unter Linux ist eigentlich bash, aber wenn Sie plattformübergreifende Skripte anstreben, sollten Sie sich besser an die Funktionen der ursprünglichen Bourne-Shell halten oder sie in etwas wie Perl schreiben. .

3
Hank Gay

Zum einen hat Bash die Tab-Vervollständigung. Dies allein genügt, um mich ksh vorzuziehen.

Z Shell hat eine gute Kombination der einzigartigen Eigenschaften von ksh mit den netten Dingen, die bash bietet, und noch viel mehr.

2
Allen

Ksh ist standardmäßig in den meisten UNIX-Systemen verfügbar, übersichtlich gestaltet und abgerundet. Ich denke Bücher, Hilfen in Ksh sind genug und klar, besonders das O'Reilly-Buch. Bash ist eine Masse. Ich behalte es als root-Login-Shell für Linux nur zu Hause.

Für die interaktive Nutzung bevorzuge ich zsh unter Linux/UNIX. Ich führe Skripte in zsh aus, aber ich werde die meisten meiner Skripte testen, funktioniert aber in AIX ksh.

2
MeaCulpa