Bash è usato di default in ogni distribuzione Linux che ho provato, su alternative come Z shell (zsh). C'è una ragione tecnica o storica per questo?
Bash è usato di default in ogni distribuzione Linux che ho provato, su alternative come Z shell (zsh). C'è una ragione tecnica o storica per questo?
Risposte:
Storia (acquisita non attraverso la ricerca ma trascorrendo troppo tempo a passare del tempo con i Bell Labs):
All'inizio (se si considera l'inizio della versione 7 di Unix) c'era la shell Bourne. Steve Bourne è stato il primo a dimostrare che la shell che controllava l'interazione dell'utente poteva essere un programma utente e non una parte speciale del sistema operativo. Una svolta storica. La shell stessa era relativamente pulita per gli script, ma non aveva modifiche alla riga di comando o controllo dei lavori. L' introduzione di Bourne a Unix Shell è ancora utile per gli utenti principianti oggi.
Modifica : ho ignorato un po 'di "preistoria" da Ken Thompson e John Mashey, anche da Multics. Sono certo che Bourne fosse a conoscenza di tutto questo lavoro (era nello stesso laboratorio, nel 1127, presso i Bell Labs), ma il guscio di Bourne era definitivo, e il lavoro precedente aveva poca influenza se non come interpretato da Steve Bourne. Ad esempio, anche se Ken in seguito scrisse il compilatore Plan 9 C e fu molto influente sul Plan 9, ma l'articolo di Tom Duff sulla shell Plan 9 (rc) menziona solo la shell di Bourne, non quella di Thompson.
La shell è solo un programma utente, quindi chiunque può scriverne uno. Mentre la versione 7 di Unix veniva creata nel New Jersey, Berkeley Unix veniva creata in California. Bill Joy di Berkeley ha scritto csh
la shell C. Joy aggiunse il controllo del lavoro e la cronologia, e successivamente la modifica della riga di comando, ma non era a conoscenza del lavoro di Bourne e quindi basò il suo linguaggio sulla shell Thompson (che consideravo "preistorica" nel proiettile precedente). La comunità Unix amava il controllo del lavoro, ma adorava anche la lingua di Bourne. Per una polemica non particolarmente buona contro il linguaggio csh, vedere Programmazione Csh considerata dannosa . Per un certo periodo, molte persone hanno usato csh
interattivamente le sue funzioni di controllo del lavoro e cronologia, ma hanno usato Bourne sh
per scrivere script. Questa situazione era meno che ideale.
Modifica : Grazie a DigitalRoss per avermi chiarito la cronologia di csh
. Da quando ho ricevuto la mia istruzione da persone che si riferiscono a BSD come "l'eresia di Berkeley", lì ero piuttosto a corto di fatti.
Dave Korn dei Bell Labs ha realizzato una brillante reingegnerizzazione della shell Bourne per produrre la shell Korn (ksh). Era completamente retrocompatibile con la shell Bourne sh
ma offriva un carico di miglioramenti inestimabili. ksh
divenne la base di uno standard POSIX e fu fornito di serie con il software Sun. (Questo nonostante il fatto che Bill Joy abbia lasciato Berkeley per aiutare a fondare Sun ed è stato uno dei loro principali ragazzi del software.)
Bell Labs e AT&T non riescono stupidamente a fare ksh
open source. ksh88
è ampiamente usato, ma avere fonti non è legale. Alcune persone diventano così dipendenti da diventare criminali digitali.
Modifica : è stato davvero così stupido? Difficile da sapere Berkeley stava già dando via Unix, e presto sarebbero seguite altre società, ma questa era ancora l'era in cui i Corporate Masters credevano nella carica per Unix. Ma i risultati: AT&T Unix è morto, dopo essere stato venduto a varie parti un numero qualsiasi di volte. BSD e i suoi derivati sono vivi e vegeti, ma queste cose iniziali chiamate "Linux" e "GNU" hanno un'enorme frazione di mindshare che una volta apparteneva ai Bell Labs.
La Free Software Foundation fa una "clean room", da zero l'implementazione di una shell POSIX, prendendo tutte le idee di Dave Korn come allora attuali, più nel solito stile FSF aggiungendo nuove funzionalità proprie, come il completamento programmabile. Lo chiamano la shell "Bourne again", o bash
.
A metà degli anni '90 AT&T open-source ksh93
, ma ormai è troppo tardi per l'adozione diffusa. L'accordo di licenza è stranamente non standard. bash
e ksh
divergono, e ksh
non raggiunge mai la quota di mercato commisurata al suo posto nella storia.
Lezioni:
Vince il primo prodotto adeguato sul mercato (sh).
Le persone adorano le nuove funzionalità (controllo del lavoro, completamento dei comandi), ma le adorano ancora di più quando i loro vecchi script continuano a funzionare.
Modifica : i professori di ingegneria dovrebbero lasciare la storia agli storici della scienza :-)
Bash ha due cose completamente diverse.
È un guscio fine. È una delle forse 2 shell (l'altra è zsh) che integra alcune delle csh
funzioni interessanti come la !
sostituzione della cronologia nella sintassi posix. Ha molte estensioni, compresi gli array.
È la shell FSF / GNU. Nel mondo open source, questo gli dà una sorta di cache.
Dovrei anche aggiungere che non è sempre l'impostazione predefinita. ash
viene spesso usato come / bin / sh in modo che mentre bash
può essere la shell interattiva, ash
è la shell "esegui semplicemente il file di comando". Questo perché ash
è più piccolo e più veloce e contiene le funzionalità posix, quindi è un sottoinsieme corretto. L'uso ash
come shell interattiva è talvolta problematico. Su, diciamo, NetBSD, funziona bene, perché lì è costruito con tutte le funzionalità. È un po 'la loro unica shell mentre bash
è un pacchetto esterno. Ma su Linux di ash
solito è considerato non interattivo, quindi lo compilano senza la cronologia e senza la (importante) modifica della linea sulla teoria che è solo usato per eseguire quegli enormi gnu configure
script.
La vera storia della conchiglia
AGGIORNAMENTO: Esiste una storia imprecisa della shell che viene copiata da un luogo all'altro sul web e le persone credono comprensibilmente. Proverò a fornire una versione accurata e fornirò alcuni link per confermarla qui.
<, >, >>, |, &
ma aveva semplicemente una goto
sintassi di controllo semplice tramite un programma esterno che cercava input standard. Allora non c'erano script di shell complessi. Le shell successive apriranno l'input del comando su un fd separato. Può sembrare semplice oggi, ma nel film horror che era il calcolo degli anni '70 era la cosa migliore sulla terra. Che ci crediate o no, questa antica shell ha il suo flusso twitter oggi e, naturalmente, una home page .csh
, scritto (come è stato vi
) da Bill Joy a UCB. Questo era prima della readline di GNU e della editline di NetBSD, quindi deve essere sembrato perfettamente ragionevole fare la storia con la !
sintassi. Csh ha aggiunto la maggior parte delle funzionalità della shell di oggi ma con la sintassi csh. csh non ha modificato alcuna sintassi , gratuitamente o in altro modo. In realtà era retrocompatibile con la shell Thompson e originariamente includeva il codice sorgente TS.osh
e csh
siamo stati popolare per qualche tempo . Non c'era internet ed era concesso in licenza SW, quindi in quell'ambiente è possibile che Stephen Bourne non sapesse della shell di Joy e certamente Joy non sapeva di Bourne. È possibile che le due shell si siano incontrate per la prima volta quando UCB ha ottenuto un VAX e un pre -rilascio dell'ormai dimenticato Unix / 32V . Ricordo che Bill si lamentava dell'allocazione di memoria. Si noti che entrambe le shell erano retrocompatibili con la shell V6, hanno semplicemente esteso la sintassi in diverse direzioni. ksh
. Alla fine, csh
aveva un codice sorgente semi-disponibile, ma è stato legato in una causa tra AT&T e l'Università della California . Tuttavia, questi erano i giorni di gloria di BSD Unix in quanto società sofisticate che potevano permettersi la commissione di $ 50.000 avrebbero acquistato la licenza AT&T ma avrebbero installato le distribuzioni 4.x BSD e le università l'hanno ottenuto gratuitamente.csh
sintassi così come con la sintassi della shell Bourne, e alcuni hanno unito i due. Hai avuto almeno tcsh
, zsh
, bash
, e ash
. La sintassi di Bourne era "ufficiale", essendo parte delle versioni AT&T, ma a quei tempi BSD era piuttosto importante e Sun, inizialmente BSD, distribuiva una discreta quantità di SW Unix che il mondo incontrava./bin
e /sbin
dipende da /usr
, è rotto e deve essere riparato; dovrebbero dipendere solo dalle librerie in /lib
. login
Ha solo bisogno di PAM; la "API più recente" che richiede librerie dinamiche sarebbe NSS. "Tendenza a"? NetBSD 2.0 è già passato a un sistema completamente dinamico /bin
e /sbin
5 anni fa, FreeBSD 5.2 anche più tempo fa e Linux ... beh, questo varia a seconda della distribuzione, ma è passato molto tempo.
Per aggiungere ciò che ha detto @DigitalRoss
Perché Linux è solo il kernel (e richiede roba di supporto) mentre GNU fornisce (o ha fornito) tutti i cloni software di base Unix che rendono utilizzabile ciò che chiamiamo "Linux". Bash è la shell del progetto GNU scritta come un clone della vecchia shell Bourne (sh) della versione 7 di Unix.
Secondo un sondaggio unix.com, non è molto più avanti di ksh.
/ bin / sh 83 8.96%
/ bin / csh 36 3.89%
/ bin / ksh 370 39.96%
/ bin / tcsh 36 3.89%
/ bin / bash 401 43.30%
Bash è ampiamente accettato grazie al suo ricco set di funzionalità. Adotta anche funzionalità di altre shell come C-shell e Korn-shell. Dai un'occhiata a questo set di funzionalità.
Perché 'bash' è compatibile al 100% 'sh / ksh' e 'ksh' è la shell POSIX.
Quindi se vuoi un sistema conforme a POSIX e sei su Linux, allora usi bash.
Se sei su un unix commerciale generalmente ottieni ksh come shell predefinita (a volte semplicemente vecchio sh). Per qualche motivo, Sun utilizza ancora il flakey csh c-shell.
Il vantaggio è che la portabilità di un .sh scritto per hp-ux o AIX ha buone probabilità di funzionare come "bash" di Linux senza alcuna modifica.
E per aggiungere a tutte le altre risposte: zsh
non è pensato per essere retrocompatibile. Probabilmente puoi configurarlo in modo che sia compatibile, ma poi stai perdendo le sue funzionalità.
Uso zsh
come la mia normale shell interattiva, ma bash
/ mi dash
sembra più sano come un linguaggio di scripting di shell; fanno meno magia e sono più prevedibili ... questo è più importante per me quando scrivo una sceneggiatura che dovrebbe funzionare per diversi anni.
Solo per confondere le cose, il sh
comando a volte è solo un collegamento simbolico ad un altro programma di shell, come ash
, bash
o dash
.
Ubuntu lo collegava a bash
, poiché bash
è progettato per eseguire qualsiasi script shell Bourne conforme.
Di recente, tuttavia, Ubuntu è passato ad avere un sh
collegamento a dash
. dash
è progettato per eseguire bash
script (e quindi anche sh
script), ma è progettato per essere utilizzato solo per gli script, quindi non ha le funzionalità interattive di bash
. Ciò lo rende più piccolo e (forse) più veloce.