it-swarm.it

Bash o KornShell (ksh)?

Non sono nuovo su * nix, tuttavia ultimamente ho trascorso molto tempo al Prompt. La mia domanda è: quali sono i vantaggi dell'utilizzo di KornShell (ksh) o Bash Shell? Dove sono le insidie ​​dell'uso l'uno sull'altro?

Cercare di capire dal punto di vista di un utente, piuttosto che semplicemente scripting.

59
user13158

Bash.

Le varie implementazioni UNIX e Linux hanno diverse implementazioni a livello di sorgente di ksh, alcune delle quali sono vere ksh, alcune sono implementazioni pdksh e alcune sono solo collegamenti simbolici ad altre Shell che hanno una personalità "ksh". Questo può portare a strane differenze nel comportamento di esecuzione.

Almeno con bash puoi essere sicuro che si tratta di una singola base di codice e tutto ciò di cui devi preoccuparti è quale versione (di solito minima) di bash è installata. Avendo fatto molti script su praticamente tutti gli UNIX moderni (e non così moderni), la programmazione su bash è più affidabile nella mia esperienza.

46
j.e.hahn

Le differenze tra Kornshell e Bash sono minime. Ci sono alcuni vantaggi l'uno rispetto all'altro, ma le differenze sono minuscole:

  • BASH è molto più semplice impostare un Prompt che visualizza la directory corrente. Fare lo stesso in Kornshell è un gioco da ragazzi.
  • Kornshell ha array associativi e BASH no. Ora, l'ultima volta che ho usato array associativi è stato ... Fammi pensare ... Mai.
  • Kornshell gestisce un po 'meglio la sintassi del loop. Di solito puoi impostare un valore in un loop di Kornshell e averlo disponibile dopo il loop.
  • Bash gestisce i codici di uscita dai tubi in modo più pulito.
  • Kornshell ha il comando print che è molto meglio del comando echo.
  • Bash ha completamenti di tabulazione. Nelle versioni precedenti
  • Kornshell ha il comando r history che mi permette di rieseguire velocemente i comandi più vecchi.
  • Kornshell ha la sintassi cd old new che sostituisce old con new nella tua directory e nei tuoi CD. È comodo quando ci si trova in una directory chiamata /foo/bar/barfoo/one/bar/bar/foo/bar e devi cd su /foo/bar/barfoo/two/bar/bar/foo/bar In Kornshell, puoi semplicemente fare cd one two e aver finito. In BASH, dovresti cd ../../../../../two/bar/bar/foo/bar.

Sono un vecchio tipo di Kornshell perché ho imparato Unix negli anni '90, e quella era la Shell di elezione di allora. Posso usare Bash, ma a volte ne sono frustrato perché in abitudine uso alcune funzionalità minori che Kornshell ha che BASH non ha e non funziona. Quindi, quando possibile, ho impostato Kornshell come predefinito.

Tuttavia, ti dirò di imparare BASH. Bash è ora implementato sulla maggior parte dei sistemi Unix e su Linux e ci sono semplicemente più risorse disponibili per l'apprendimento di BASH e per ottenere aiuto rispetto a Kornshell. Se hai bisogno di fare qualcosa di esotico in BASH, puoi andare su Stackoverflow, pubblicare la tua domanda e riceverai una dozzina di risposte in pochi minuti - e alcune di esse saranno persino corrette !.

Se hai una domanda su Kornshell e la pubblichi su Stackoverflow, dovrai aspettare un vecchio passato come il loro hacker principale come me svegliarmi dal suo pisolino prima di ottenere una risposta. E, dimentica di ricevere qualsiasi risposta se stanno servendo il budino nella casa di riposo di quel giorno.

BASH è semplicemente la Shell preferita ora, quindi se devi imparare qualcosa, potresti anche andare con ciò che è popolare.

122
David W.

Sono un veterano di Shell Korn, quindi sappi che parlo da quella prospettiva.

Tuttavia, mi sono trovato a mio agio con Bourne Shell, ksh88 e ksh93 e per la maggior parte so quali funzioni sono supportate in quali. (Dovrei saltare ksh88 qui, poiché non è più ampiamente distribuito.)

Per un uso interattivo, prendi quello che ti soddisfa. Sperimentare. Mi piace essere in grado di utilizzare la stessa Shell per uso interattivo e per la programmazione.

Sono passato da ksh88 su SVR2 a tcsh, a ksh88Sun (che ha aggiunto un significativo supporto all'internazionalizzazione) e ksh93. Ho provato bash e l'ho odiato perché ha appiattito la mia storia. Poi ho scoperto shopt -s lithist e tutto andava bene. (L'opzione lithist assicura che le nuove righe vengano conservate nella cronologia dei comandi.)

Per la programmazione Shell, raccomanderei seriamente ksh93 se si desidera un linguaggio di programmazione coerente, una buona conformità POSIX e buone prestazioni, poiché molti comandi unix comuni possono essere disponibili come funzioni integrate.

Se vuoi la portabilità usa almeno entrambi. E assicurati di avere una buona suite di test.

Esistono molte sottili differenze tra le shell. Considera ad esempio la lettura da una pipe:

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

Ciò produrrà risultati diversi in diverse shell. Il korn-Shell esegue tubazioni da dietro a davanti; l'ultimo elemento nella pipeline viene eseguito nel processo corrente. Bash non ha supportato questo comportamento utile fino a v4.x e, anche in questo caso, non è l'impostazione predefinita.

Un altro esempio che illustra la coerenza: il comando echo stesso, reso obsoleto dalla divisione tra BSD e SYSV unix, e ciascuno ha introdotto la propria convenzione per non stampare nuove righe (e altri comportamenti). Il risultato di questo può ancora essere visto in molti script 'configura'.

Ksh ha adottato un approccio radicale e ha introdotto il comando print, che in realtà supporta entrambi i metodi (il -n opzione da BSD e il trascinamento \c carattere speciale da SYSV)

Tuttavia, per la programmazione di sistemi seri, consiglierei qualcosa di diverso da una Shell, come Python, Perl. Oppure fai un ulteriore passo avanti e utilizza una piattaforma come un pupazzo, che ti consente di guardare e correggere lo stato di interi gruppi di sistemi, con un buon controllo.

La programmazione della shell è come nuotare in acque inesplorate, o peggio.

La programmazione in qualsiasi linguaggio richiede familiarità con la sua sintassi, le sue interfacce e il suo comportamento. La programmazione della shell non è diversa.

28
Henk Langeveld

Questo è un po 'una battaglia tra Unix e Linux. La maggior parte se non tutte le distribuzioni Linux hanno installato bash e ksh opzionale. La maggior parte dei sistemi Unix, come Solaris, AIX e HPUX hanno ksh come impostazione predefinita.

Personalmente uso sempre ksh, adoro il completamento di vi e praticamente uso Solaris per tutto.

4
Kristian

Per gli script, utilizzo sempre ksh perché smussa gotchas .

Ma trovo bash più comodo per l'uso interattivo. Per me i emacs le combinazioni di tasti e il completamento della scheda sono i principali vantaggi. Ma questa è principalmente la forza dell'abitudine, non alcun problema tecnico con ksh .

4
Jon Ericson

Non ho esperienza con ksh, ma ho usato sia bash che zsh. Preferisco zsh rispetto a bash a causa del suo supporto per il globbing di file molto potente, i modificatori di espansione variabili e il completamento più veloce delle schede.

Ecco una breve introduzione: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

La mia risposta sarebbe "scegline una e impara come usarla". Sono entrambi conchiglie decenti; bash probabilmente ha più campane e fischietti, ma entrambi hanno le caratteristiche di base che vorrai. bash è più universalmente disponibile in questi giorni. Se stai usando Linux tutto il tempo, resta fedele.

Se stai programmando, cercare di attenersi al semplice "sh" per la portabilità è una buona pratica, ma quindi con bash disponibile così ampiamente in questi giorni che un po 'di consigli è probabilmente un po' vecchio stile.

Scopri come utilizzare il completamento e la cronologia di Shell; leggere la manpage di tanto in tanto e provare ad imparare alcune cose nuove.

3
Incident

@foxxtrot

In realtà, la Shell standard è Bourne Shell (sh). /bin/sh su Linux è in realtà bash, ma se stai puntando a script multipiattaforma, è meglio attenersi alle funzionalità dell'originale Bourne Shell o scriverlo in qualcosa come Perl .

3
Hank Gay

Per prima cosa, bash ha il completamento della scheda. Questo da solo è abbastanza per farmi preferire a ksh.

Z Shell ha una buona combinazione delle caratteristiche uniche di ksh con le cose belle fornite da bash, oltre a molte altre cose.

2
Allen

Disponibile nella maggior parte dei sistemi UNIX, ksh è conforme allo standard, chiaramente progettato, ben arrotondato. Penso che i libri, aiuti in ksh siano sufficienti e chiari, specialmente il libro di O'Reilly. Bash è una massa. Lo tengo come login root Shell per Linux solo a casa.

Per uso interattivo, preferisco zsh su Linux/UNIX. Eseguo script in zsh, ma testerò la maggior parte dei miei script, funzioni in AIX ksh però.

2
MeaCulpa