Quali sono le differenze fondamentali tra le shell NIX tradizionali? [chiuso]


52

Quali sono le differenze fondamentali tra le shell NIX tradizionali e quali scenari potrebbero spingerti a usarne uno rispetto all'altro? Capisco che parte di questo probabilmente dipende dalle preferenze dell'utente, ma ho sempre usato bash e sono interessato a sapere dove potrebbe essere utile un'altra shell.

Inoltre, c'è un impatto sugli script della shell scritti dall'utente quando si esegue sotto una shell o un'altra o si tratta semplicemente di cambiare la shell nella parte superiore del file? Il mio istinto dice che non è così facile.

Risposte:


52

Per un uso interattivo, ci sono due contendenti principali, bash e zsh , oltre allo straggler tcsh e al nuovo pesce .

  • Bash è la shell ufficiale del progetto GNU e la shell predefinita sulla maggior parte delle distribuzioni Linux. Su altri unices che non vengono forniti con una shell interattiva decente come parte dell'installazione di base, penso che bash sia ciò che la gente tende a scegliere, in un ciclo di auto-rinforzo "bash è ovunque, quindi lo userò anch'io". Vedi anche Perché bash è ovunque? (con molte informazioni storiche).

  • Zsh ha quasi tutte le funzionalità di bash e molte altre (utili!) Funzionalità. Il suo principale svantaggio è quello di essere meno noto, il che, in pratica, significa che è meno probabile che tu lo trovi già installato su un sistema configurato da qualcun altro e ci sia meno documentazione di terze parti al riguardo. Vedi anche Quali funzionalità zsh usi? , Quali funzionalità sono presenti in zsh e mancano da bash o viceversa? .

  • Tcsh era una volta (fino ai primi anni '90) la shell con le migliori funzionalità interattive, come il suo predecessore csh. Ciò lo ha reso popolare per l'uso interattivo (ma non per gli script ). Zsh ha raggiunto tcsh e abbastanza rapidamente è migliorato ulteriormente, e bash ha raggiunto (con completamento programmabile) all'inizio degli anni 2000, mentre tcsh ha appena fatto progressi negli ultimi 15 anni. Quindi non c'è motivo di imparare ora tcsh.

  • Il pesce cerca di essere più pulito dei suoi predecessori. Ha alcune caratteristiche pulite (sintassi più semplice, colorazione della sintassi sulla riga di comando) ma manca di altre (qualunque cosa non piaccia all'autore). La comunità dei pesci è molto più piccola di quella degli zsh, rendendo gli effetti ancora più acuti.


Per lo scripting, ci sono diverse lingue che potresti voler scegliere come target, a seconda di quanto siano portatili i tuoi script.

  • Qualunque cosa che finge di essere simile a Unix ha una shell derivata da Bourne come /bin/sh. Esistono ancora alcuni uffici commerciali in cui /bin/shnon è conforme POSIX .

  • Quasi ogni unix attualmente in esecuzione ha un sheseguibile che è almeno conforme a POSIX.2-1992 e di solito almeno POSIX: 2001 aka Single Unix v3 . Questa shell potrebbe vivere in una directory diversa come /usr/bin/posixo /usr/xpg6/bin. I livelli di emulazione POSIX esistono anche per quasi tutti i sistemi che sono abbastanza potenti da supportarlo, rendendolo un bersaglio attraente.

  • Molti sistemi Unix hanno ksh93 , che porta alcune caratteristiche molto utili che POSIX sh manca (array, array associativi, globuli estesi ( *(foo), @(foo|bar), ...), null gocce ( ~(N)foo*), ...). Ksh era inizialmente un software commerciale (divenne gratuito nel 2000, dopo che alcune abitudini erano state stabilite), e molti unices liberi (Linux, * BSD) hanno preso l'abitudine di fornire solo un clone libero molto più vecchio ( pdksh ) privo di molte di queste utili funzionalità . Pdksh ora viene sostituito da mksh al di fuori di OpenBSD, ma anche mksh non riesce a implementare tutte le funzionalità di ksh93. Oggi, non puoi contare sul fatto che ksh93 sia disponibile ovunque, specialmente su Linux dove bash è la norma.

  • Bash è sempre disponibile su Linux (tranne alcune varianti incorporate) e spesso su altri unices. Ha la maggior parte delle utili funzioni di ksh93, anche se a volte con una sintassi diversa.

  • Zsh ha la maggior parte delle utili funzioni di ksh93 e bash. La sua sintassi principale è più pulita ma incompatibile con Bourne. Tranne macOS, non contare sul fatto che zsh sia disponibile su un sistema che non hai installato.

  • Per script più avanzati, puoi passare a Perl o Python . Queste lingue hanno strutture dati adeguate, discrete funzionalità di manipolazione del testo, combinazione di processi e meccanismi di comunicazione decenti e tonnellate di librerie disponibili. La maggior parte dei sistemi unix li ha, sia in bundle con il sistema operativo o installati dall'amministratore (perché ci sono così tanti script Perl e Python là fuori che è un sistema raro che non ha almeno uno di ciascuno).


4
Per lo script mi ​​rivolgo al trattino, (a meno che non mi servano le funzionalità avanzate di bash) che ha un set minimo di funzionalità ed è una lamentela posix per la massima compatibilità. (ed è leggero e veloce)
hildred l'

Ottimo documentaion! Due note. Innanzitutto, Solaris è uno di quei "sistemi commerciali in cui / bin / sh non è conforme a POSIX". In particolare, utilizza jsh(che non è una shell Java!), Che manca di sostituzione variabile come ${VAR#foo}e ${VAR%bar}.
Adam Katz,

In secondo luogo, tcshè piuttosto popolare tra gli utenti UNIX che hanno imparato i loro trucchi prima della ~ metà degli anni '90 (che hanno visto l'introduzione di entrambi bashe zsh), specialmente tra i vecchi Csviluppatori UNIX + , che hanno iniziato la loro vita con csh(promemoria, la c in cshsta per la Clingua , che è stato l'ispirazione per le sue differenze rispetto alle conchiglie in stile bourne). Vedi anche la programmazione Csh considerata dannosa , che uso spesso per suggerimenti sulla magia profonda POSIX (oltre ai suoi argomenti anti-csh).
Adam Katz,

Mac OS X non è mai "OS / X". (: E in che modo zsh è incompatibile con Bourne? (Bene, tranne per le cose come non le espansioni variabili di divisione delle parole.)
SilverWolf - Reinstate Monica il

@seaturtle L'espansione di variabili non frazionanti è la principale differenza che spezzerebbe molti script sh se si provasse a eseguirli con zsh (a meno che non si esegua zsh in una modalità di emulazione sh / ksh).
Gilles 'SO- smetti di essere malvagio' il

27

Esistono due tipi di base di shell, sh (es. Bash) e csh (es. Tcsh). Per uso interattivo, dipende principalmente da ciò a cui sei abituato. Ho usato csh, e poi tcsh, per anni e sarebbe doloroso cambiare, solo perché ci sono abituato. Ho usato anche bash e non credo che ci siano ragioni convincenti per cambiare. Tranne forse se l'uno o l'altro non è disponibile su macchine che usi regolarmente.

Per la programmazione, la sintassi è diversa. Non puoi semplicemente cambiare la shell, ma devi anche cambiare la sintassi dello script. Per lo scripting, si desidera utilizzare sh o bash. La sintassi è molto più suscettibile agli script, come spiegato qui (grazie a Riccardo Murri per il link. È una buona guida sugli script bash.

Se non hai deciso su una shell e ti aspetti di scrivere degli script, userei bash solo per ridurre la quantità di cose che devi imparare.


12

Ai vecchi tempi, quando AT&T inventò UNIX, c'era Bourne Shell, scritta da Steve Bourne. Era piuttosto semplice e mancava un sacco di strumenti che diamo per scontati al giorno d'oggi.

AT&T non era realmente nel settore UNIX, quindi in questo momento il sistema operativo di base era stato adottato da Berkelely in qualche modo e hanno apportato alcune modifiche a BSD UNIX. Tra i molti cambiamenti, c'era una nuova shell, chiamata csh, che aveva molti miglioramenti rispetto a sh, incluso un migliore controllo interattivo del controllo del lavoro e così via. Sfortunatamente, decisero che la sintassi di programmazione sh risucchiava e crearono il loro (un po 'male) copiato dagli stili di codifica C. (Un classico rant è http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) Quindi ora c'erano due sintassi.

Successivamente, hanno apportato miglioramenti a CSH aggiungendo il completamento della scheda e alcune altre cose. Questo è diventato tcsh e se usi CSH, questo è probabilmente quello che usi.

AT&T ha deciso che non era totalmente fuori dal business UNIX e hanno anche risolto il problema. David Korn (bravo ragazzo) ha creato la shell Korn. Basato sull'idea di estendere la sintassi della shell Bourne, ha aggiunto molte cose sia per i programmatori che per l'uso interattivo. In realtà ci sono alcune versioni e raramente potresti vedere cose come ksh88 e ksh93, che indicano le varianti.

Poi sono arrivati ​​FSF e il sistema operativo GNU. Volevano creare il loro sistema operativo compatibile con UNIX chiamato Hurd e volevano una shell migliore per questo. Hanno chiamato bash, per Bourne Again SHell. Le regole POSIX sono arrivate proprio in questo periodo e volevano creare la shell POSIX. Si sono guardati intorno, prendendo la sintassi dalla shell Bourne e i miglioramenti dalla shell Korn, oltre a rubare ed estendere le funzionalità interattive da tcsh. È diventata la shell di fatto su Linux, quindi è molto comune.

C'è anche lo zsh, scritto per essere la shell "definitiva". È anche molto comune nel mondo Linux. Si estendeva bash (e si impollinava un po ', alcune cose nuove sono tornate a bash).

Se dovessi scegliere una conchiglia, sceglierei bash o zsh. bash è probabilmente in qualche posto in più rispetto a zsh. zsh è più potente, ma bash è andato bene per me. La shell Bourne reale / bin / sh esiste solo per motivi storici. bash ha praticamente tutto ciò che ksh ha da offrire e altro ancora. La sintassi è più pulita di csh o tcsh e presenta funzionalità migliori di una di esse.

La conversione di uno script dipende da cosa a cosa. Lo stile della shell Bourne (sh, ksh, bash, zsh) da o verso lo stile csh (csh, tcsh) sarà difficile. Passare dal vecchio al più recente (/ bin / sh => bash, / bin / ksh => zsh) sarà più facile dell'altro modo.


Si noti che la pagina csh-whynot è stata riscritta nel settembre 1995 (controllare il tag della versione in alto). Non lo so, ma mi sarei aspettato che molte cose fossero cambiate nei 18 anni da allora.
un CVn

8

I due rami principali delle conchiglie sono i derivati ​​della shell Bourne (sh, bash, ksh, ash, yash e zsh) e i derivati ​​csh (tcsh e ... uhm ... tcsh).

Ho il sospetto (anche se non ho numeri reali) che bash sia il più usato, sembra essere la shell di default nella maggior parte dei Linux.

La maggior parte delle cose scritte in un derivato di bourne shell probabilmente funzionerà in altre. La maggior parte delle cose scritte in una shell Bourne dovrà probabilmente essere modificata per funzionare in csh o tcsh.

Personalmente ho usato ksh quando ho iniziato perché è quello che era sul sistema che stavo usando. Uso principalmente bash ora.


1
fish is a csh ispirated shell
hildred

1

Ho usato numerose conchiglie nel tempo. Non qualcosa di super avanzato, ma un sacco di pratico sistema e roba di programmazione che ha richiesto una personalizzazione sufficiente.

Penso che zsh abbia più opzioni di personalizzazione, almeno una volta, ma dopo averlo usato per alcuni anni ne ho avuto abbastanza con i suoi problemi di stabilità e codifica dei caratteri. Bash è solido come una roccia, non ha mai avuto problemi simili ed è installato ovunque.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.