Qual è la differenza tra bash, zsh, tcsh, sh ecc.? Quale dovrei usare?

Migliore risposta

Queste sono tutte shell e ce ne sono molte altre che non hai menzionato. Quale scegli di utilizzare è una questione di preferenze personali.

La prima shell era la Bourne Shell (o sh) ed era limpostazione predefinita su Unix per molto tempo. Poi è arrivata una derivazione importante in Unix e una nuova shell è stata creata da zero chiamata C Shell (o csh). La vecchia Bourne Shell è stata quindi seguita dalla compatibile ma molto più potente Korn Shell (o ksh). Le shell disponibili generalmente rientrano in una di queste categorie: Bourne / Korn Shell derivative (bash), C Shell derivative o clone (tcsh) o “altro” (come zsh).

Ci sono molte shell da scegli tra e non solo quelli che hai menzionato. La bash GNU rientra nel campo Bourne / Korn Shell ed è la shell predefinita su unampia varietà di varianti Unix e Linux oggi. Se hai usato un terminale shell su Unix o Linux, è probabile che fosse questo. Se vuoi veramente e veramente Bourne Shell (sh) credo che ora sia disponibile gratuitamente – ma generalmente viene evitato perché non ha abbastanza funzionalità. La shell Korn è retrocompatibile ed è anche gratuita sotto forma di cloni (mksh) e loriginale recentemente rilasciato (ksh).

Per la shell C, cè tcsh, un clone espanso delloriginale csh Ci sono meno cloni di csh perché csh non è stato visto come una via da seguire e non ha tanti utenti – tuttavia, molte versioni BSD di Unix (come FreeBSD e altri) useranno csh come loro shell predefinita.

Ci sono varianti che non sono compatibili con sh / ksh o csh, ma tendono ad essere shell di nicchia. I miei preferiti in questo spazio sarebbero Scheme Shell (scsh) e Plan 9 shell rc – ma questi non sono mai installati di default su Unix o Linux e il primo è piuttosto grande. zsh rientra anche in questa categoria “altro”.

La mia raccomandazione è triplice: prima prova la shell predefinita sul tuo sistema – quasi certamente GNU bash. Bash è ovunque e leggerà ed eseguirà i programmi Bourne Shell e Korn Shell senza incompatibilità. In secondo luogo, prova ciascuna delle shell che vuoi veramente provare (come zsh o tcsh) e lavoraci per un po e vedi se soddisfa le tue esigenze. Infine, usa quello che più si adatta alla tua fantasia.

Nota che non devi scrivere script nella shell che usi: Ho usato la shell C in modo interattivo ma mi sono rifiutato di programmarci (tutti i miei script usavano la shell Korn). Infine, un giorno mi sono tuffato in ksh e non ho mai guardato indietro.

I miei preferiti personali a questo punto sono mksh (un clone di Korn Shell senza estensioni) – o GNU bash con piena compatibilità con Korn Shell – o rc , la shell del nuovo sistema operativo Plan 9 che avrebbe dovuto essere un successore di Unix (sebbene questo non si sia concretizzato).

Risposta

Meglio per cosa?

Quali sono i tuoi criteri?

Personalmente suggerisco bash perché è limpostazione predefinita sui sistemi Linux e MacOS X e prontamente disponibile su tutte le altre forme di Unix e sotto MS Windows tramite Cygwin ed è limpostazione predefinita per Microsoft ™ Windows Services for Linux “ (livello di supporto / sottosistema di Ubuntu bash ).

Fondamentalmente è il percorso di minor resistenza se hai intenzione di utilizzare molti sistemi diversi nel corso di molti anni … e spesso accederai a sistemi appena ricreati o istanze appena lanciate con deviazioni minime dalla base del sistema operativo (come è comune per le server farm web / app ridimensionate). È abbastanza vicino alla shell Korn che poche persone troveranno i casi dangolo in cui differiscono nella semantica. (La maggior parte degli utenti non noterà la differenza tra cloni di Bourne shell più minimali come ash e trattino e le funzionalità che bash aggiunge, tanto meno essere in grado di distinguere tra le differenze tra ksh e bash .

zsh è probabilmente il più potente e personalizzabile. È più adatto per qualcuno che è veramente appassionato di utilizzare e personalizzare il proprio guscio. Lo svantaggio di usarlo … con tutti i suoi miglioramenti e personalizzazioni … è che lutente probabilmente troverà frustrante tornare a usare un altro guscio quando problemi di debug su sistemi in cui zsh non è stato (ancora) installato, cosa che gli addetti alle operazioni / amministratori di sistema negli ambienti moderni fanno abbastanza frequentemente.È anche piuttosto sconsiderato quando si lavora con o si fa da mentore ai colleghi e si cerca di mostrare loro qualcosa al prompt della shell o di condividere uno schermo GNU o tmux con loro.

La shell Korn, ksh , è una shell migliore per lo scripting di bash in alcuni piccoli dettagli … ma non abbastanza perché valga la pena di doverlo scaricare, installare e configurare ovunque.

ksh supportava “array associativi” (hash / dizionari) per molti anni prima che bash lo aggiungesse. (È stato aggiunto a bash solo pochi anni fa, non è ancora incluso nelle versioni predefinite di MacOS X, ad esempio). Quindi di solito è meglio non usare semplicemente array associativi negli script della shell. Se pensi di volere le sue funzionalità, di solito è meglio passare a Python, Ruby, Perl, TCL / wish o a qualsiasi altro linguaggio di scripting generico . Non cè molto da guadagnare passando a una shell diversa (in termini di sovraccarico operativo) solo per quella caratteristica.

Lo stesso si può dire di ksh Coprocessi .

Lunica altra differenza notevole è quella che deve essere spiegata. Considera il seguente comando di shell:

unset foo; echo bar | read foo; echo "$foo"

Questo è perfettamente valido in qualsiasi shell compatibile con Bourne. Ma si comporterà in modo diverso sotto i vari gusci. Emetterà la stringa “bar” (e una nuova riga) oppure emetterà solo la riga vuota.

bash farà il secondo, mentre ksh e zsh si esibiranno nel primo modo. La variabile di shell “foo” verrà impostata nella shell corrente. A mio parere questa è la semantica preferita.

Ma questo è un caso dangolo. Per quanto ne so, non è coperto dalle specifiche Posix per la shell Unix; quindi il fatto che il comportamento dipenda dallimplementazione non è un bug. Questo è semplicemente qualcosa di cui un esperto nella shell deve essere a conoscenza e testare o aggirare.

La ragione di questo comportamento è che loperatore “pipe” nella shell è una comunicazione tra processi meccanismo. La shell deve creare una subshell, cioè un sottoprocesso che esegue la propria copia della memoria del processo genitore. Tuttavia, qualsiasi implementazione data può analizzare il comando ed eseguire la parte prima (a sinistra del) simbolo pipe nella subshell (come fatto da ksh e zsh ) o dopo (a destra della) pipe (come fatto da bash, molto vecchie versioni di ksh (prima del rilascio del 1983?) e la vecchia shell Bourne e la maggior parte dei suoi cloni come ash e trattino .

Unopera intorno consiste nellusare il raggruppamento dei comandi per garantire che tutti i comandi dopo la pipe siano “nellambito” con il read integrato in questo modo:

unset foo; echo bar | { read foo; echo "$foo"; }

(Per inciso, questo esempio espone un bug sottile che esisteva in bash prima della 1.4 e che è stato corretto in seguito; il parser utilizzato per trattare {} caratteri e token ve molto simile alle () (parentesi). Quindi tollerava di omettere quel punto e virgola dopo il mio echo “$ foo” , che tecnicamente era una deviazione dalle specifiche. Il problema è che milioni di persone usavano bash e scrivevano script basati sul presupposto che non avevano bisogno di terminare il loro comando prima di una parentesi graffa di chiusura, con una punto e virgola o una nuova riga. Quindi alcuni di questi vecchi script di shell mostrano ancora questo bug ben oltre un decennio dopo e ci sono solo poche persone che conoscono la shell abbastanza bene da individuarla e risolverla).

Per quanto riguarda luso interattivo, bash è chiaramente superiore a ksh ma probabilmente non è del tutto allaltezza di zsh per chiunque voglia impegnarsi a imparare e utilizzare miglioramenti e personalizzazioni estremamente complicati.

bash supporta il completamento programmabile [Tab] e le librerie GNU readline per un controllo estremamente flessibile sulle associazioni di tasti, la modifica della riga di comando e laccesso alla cronologia dei comandi. ksh ha il comando fc relativamente limitato (che bash supporta anche) per il tuo “comando di correzione”, ovvero selezionare gli elementi dalla cronologia, visualizzarli nel tuo editor di testo preferito ed eseguire automaticamente il contenuto di quel file temporaneo modificato alluscita.

Ma bash lo supporta e il suo emacs o vi accesso alla cronologia e modifica e il vecchio csh ! (bang) anche gli operatori.

bash supporta la modifica di vi mode ( set -o vi ) che era, se ricordo bene, limpostazione predefinita in ksh 93. Ma bash utilizza per impostazione predefinita la modalità emacs ( imposta -o emacs ). Inoltre, ovviamente, si può anche utilizzare il comando bash bind per ricollegare qualsiasi tasti per una qualsiasi delle numerose funzioni di modifica e manipolazione della cronologia o in macro che si espandono in qualsiasi testo che potresti voler inserire in una riga di comando.

Inoltre bash ha molte variabili dambiente “magiche” che possono fare cose che sono quasi inimmaginabilmente sottili e complesse. Ad esempio, puoi impostare la variabile PROMPT\_COMMAND per eseguire un hook personalizzato ogni volta che bash è per presentare il suo prompt. Quindi potresti avere quel controllo per qualche magico .dot\_file e personalizzare nuovamente la tua shell in esecuzione in base alla directory in cui ti trovi, o reimpostare la stringa del prompt e i colori dello schermo del terminale in base allora del giorno, o interrogare qualche sito web ed eseguire automaticamente un comando basato su … praticamente qualsiasi cosa.

(Ho usato quellhook per attivare automaticamente gli ambienti virtuali Python semplicemente passando alla loro directory di lavoro ad esempio).

Quando si considera tcsh (o il suo antenato, csh ) allora sei un po di nicchia. È comune vedere gli script csh nel campo dellEDA (automazione della progettazione elettronica). Ma questo è un incidente della storia e la maggior parte delle persone che lavorano in questo campo non utilizza tcsh per il loro uso interattivo.

Il pesce shell è una nicchia. Non lho mai usato abbastanza per farmi unopinione su di esso, ed è certamente abbastanza colorato. Ma penso che avrà un litigio molto difficile da zappare prima che coltivi un seguito veramente diffuso. A meno che Apple ™ non inizi a distribuirlo come shell predefinita per i propri sistemi Mac ™, è probabilmente destinato a rimanere nella sua nicchia per il prossimo futuro.

Quindi spero di aver capito il punto. Non ha davvero molto senso chiedersi “qual è il migliore …” (praticamente qualsiasi cosa in cui ci siano alternative ragionevoli).

Nel caso delle shell dei comandi Unix le differenze tra le shell compatibili Bourne sono così minori che solo gli esperti possono distinguerli, e quelli hanno dei compromessi e alla fine si riducono a preferenze piuttosto soggettive. Ho colleghi appassionati delle loro impostazioni zsh e altri che semplicemente si preoccupano. Sono a metà strada tra laver adattato me stesso alla scelta più prontamente disponibile.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *