Perché Bash è ovunque (nella maggior parte se non in tutte le distribuzioni Linux)?


50

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?


1
Non è. Sul mio sistema FreeBSD tcsh è la shell predefinita!

54
Il tuo sistema FreeBSD non è una distribuzione Linux.

8
Dio non voglia che ci sia una certa coerenza tra le distro ...
OMG Ponies,

4
No, ma appartiene a "ovunque" :)

Risposte:


106

Storia (acquisita non attraverso la ricerca ma trascorrendo troppo tempo a passare del tempo con i Bell Labs):

  1. 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.

  2. 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 cshla 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 cshinterattivamente le sue funzioni di controllo del lavoro e cronologia, ma hanno usato Bourne shper 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.

  3. 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 shma offriva un carico di miglioramenti inestimabili. kshdivenne 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.)

  4. Bell Labs e AT&T non riescono stupidamente a fare kshopen 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.

  5. 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.

  6. 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. bashe kshdivergono, e kshnon 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 :-)


Penso che tu abbia davvero la spiegazione più completa e accurata per la popolarità di bash su tutto il resto. Ho visto ambienti che per impostazione predefinita sono zsh e li odio perché tutta la sintassi è solo un po 'fuori e non riesco a capirlo o faccio errori.

Bullet (1) necessita di correzione: prima che la shell Bourne fosse la shell Mashey, e prima che la shell Mashey fosse la shell Ur, la shell Ken Thompson. Vedi en.wikipedia.org/wiki/Unix_shell
Jim Ferrans,

2
Senza incolpare Norman in modo specifico, ci sono molte imprecisioni qui. Ken Thompson ha scritto la prima shell, che era l'unica shell attraverso V6 ed era in uso in parallelo in V7 e 32V. Stephen Bourne non è stato il "primo" scrittore di shell, ha riscritto la shell KT. Csh non aveva il controllo del lavoro fino a 4.1BSD, sebbene fosse la prima shell a ottenerlo. Csh non ha modificato alcuna sintassi della shell, era retrocompatibile con la shell V6, così come la shell Bourne. Quasi tutto il codice era concesso in licenza in quei giorni. Che cosa è stato esattamente stupido nel far pagare le tasse di licenza per Unix?
DigitalRoss,

2
Probabilmente non lo sto spiegando molto bene, lasciami riprovare. Csh precede Bourne , o al più tardi è stata un'implementazione parallela a distanza di un continente. (Prima di Internet, quello contava.) Ero seduto accanto a Bill Joy nella Cory Hall, di tanto in tanto, quando lo scriveva; Posso assolutamente assicurarti che l'ha scritto su V6. Come ho detto, csh (e Bourne) sono compatibili con V6-Thompson all'indietro, poiché questo è tutto ciò che esisteva quando li scrissero. Ovviamente non è compatibile con Bourne, i talenti di AFAIK Bill Joy non includevano il vedere il futuro
DigitalRoss,

1
Non hai bashpreso l'idea del completamento programmabile da tcsh?

46

Bash ha due cose completamente diverse.

  1. È un guscio fine. È una delle forse 2 shell (l'altra è zsh) che integra alcune delle cshfunzioni interessanti come la !sostituzione della cronologia nella sintassi posix. Ha molte estensioni, compresi gli array.

  2. È la shell FSF / GNU. Nel mondo open source, questo gli dà una sorta di cache.

Dovrei anche aggiungere che non è sempre l'impostazione predefinita. ashviene spesso usato come / bin / sh in modo che mentre bashpuò 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 ashcome 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 ashsolito è 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 configurescript.

Storia di due conchiglie

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.

  1. La prima shell non era certamente la Bourne ma fu scritta dallo stesso Ken Thompson e distribuita nel V6, che è la versione che AT&T ha inviato a varie università e laboratori governativi. Questo è ciò che ha messo Unix sulla mappa. Aveva tutte le basi, <, >, >>, |, &ma aveva semplicemente una gotosintassi 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 .
  2. Il secondo guscio è stato 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.
  3. La terza shell era la shell Bourne, con sintassi diversa. Unix veniva sviluppato in parallelo presso UCB e AT&T. Questo guscio ha avuto un allocatore di memoria strano (penso che appena usato più memoria, SIGSEGV intrappolato, ha fatto un nuovo BRK (2), e poi ha cercato di nuovo) che ha reso difficile per funzionare su nuovi porti Unix, così oshe cshsiamo 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.
  4. Ora c'erano davvero più shell incompatibili, a cui AT&T aggiungeva il Bourne-compatibile ksh. Alla fine, cshaveva 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.
  5. In questa situazione con molte questioni legali e tecniche, sono state intraprese varie implementazioni indipendenti. Almeno molti sono andati con la cshsintassi 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.
  6. In parte a causa della causa USL, la FSF e Linux avevano un campo aperto. Nel frattempo, AT&T era riuscito a combattere con una delle poche entità al mondo più grandi di loro (lo stato della California) e alla fine non hanno vinto il seme, e quindi alla fine la distribuzione di BSD era legale piede. Ma a quel tempo Linux e Bash erano ovunque, e così oggi BSD è una nicchia.
  7. Infine, bash è una buona conchiglia (sebbene apparentemente rinnegata privatamente dal suo autore originale) e merita pienamente il merito del proprio successo. csh sarebbe stato eclissato da tcsh e zsh anche se ash, bash e ksh non avessero vinto la guerra di sintassi.

Inoltre, / bin / sh deve essere staticamente collegato.

Se qualcosa dentro /bine /sbindipende da /usr, è rotto e deve essere riparato; dovrebbero dipendere solo dalle librerie in /lib. loginHa 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 /bine /sbin5 anni fa, FreeBSD 5.2 anche più tempo fa e Linux ... beh, questo varia a seconda della distribuzione, ma è passato molto tempo.
effimero

2
Voglio chiarire che la mia risposta è il mio lavoro originale; nessuna parola è stata copiata da nessuna parte.
Norman Ramsey,

1
Certo, non intendevo che lo avessi incollato, solo che ci sono molte disinformazioni in giro e non volevo colpire te per aver segnalato una storia già fraintesa.
DigitalRoss,

6

Per aggiungere ciò che ha detto @DigitalRoss

  • Bash è un sostituto superset completo per posix-sh, anche al punto se chiamato come / bin / sh emulerà completamente posix-sh. Posix-sh era lo "standard" per i sistemi unix commerciali come shell a denominazione comune. Quindi, qualcosa che inizia lì e si basa su di esso inizia molto.

4

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.


non sta chiedendo "perché c'è un programma di shell"
hasen

@hasen j: La domanda viene posta se esiste una ragione storica per cui tutti i sistemi Linux che ha usato per impostazione predefinita Bash come shell.
supplica il

2
@hasen j: beggs non risponde "perché esiste un programma shell". Ti sei perso il punto della risposta, come ovviamente tutti gli altri downvoter SO istintivi.

1

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%


0

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à.


0

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.


kshnon è la shell POSIX . Non esiste una shell POSIX . Ci sono shell conformi alla specifica POSIX, che kshè una delle, ma non è l'unica.

0

E per aggiungere a tutte le altre risposte: zshnon è pensato per essere retrocompatibile. Probabilmente puoi configurarlo in modo che sia compatibile, ma poi stai perdendo le sue funzionalità.

Uso zshcome la mia normale shell interattiva, ma bash/ mi dashsembra 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.


0

Solo per confondere le cose, il shcomando a volte è solo un collegamento simbolico ad un altro programma di shell, come ash, basho dash.

Ubuntu lo collegava a bash, poiché bashè progettato per eseguire qualsiasi script shell Bourne conforme.

Di recente, tuttavia, Ubuntu è passato ad avere un shcollegamento a dash. dashè progettato per eseguire bashscript (e quindi anche shscript), 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.

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.