Perché ci sono più shell in un sistema simile a Unix?


16

Ho appena iniziato a studiare i fondamenti di Unix e mi chiedo perché ci siano così tante shell in un sistema unix come. Dal libro Advanced programming in Unix Environment :

Una shell è un interprete della riga di comando che legge l'input dell'utente ed esegue i comandi. L'input dell'utente a una shell è normalmente dal terminale (una shell interattiva) o talvolta da un file (chiamato script di shell).

E poi il libro continua a elencare una serie di programmi di shell come Bourne shell, Bourne-again shell, Cshell, ecc. La mia domanda è sostanzialmente perché abbiamo bisogno di più shell?


4
Si applica lo stesso motivo per cui esistono così tanti standard per varie altre tecnologie. xkcd.com/927
Dan è Fiddling di Firelight il

1
Per lo stesso motivo per cui puoi avere compilatori / interpreti per più linguaggi di programmazione (anche più compilatori per una lingua) o più browser Internet.
Mischa Arefiev,

6
La tua domanda è presuntiva. " Perché abbiamo bisogno di più shell? " Chi ti ha detto che abbiamo bisogno di più shell? Il tuo libro dice che abbiamo più conchiglie. Questa non è la stessa cosa.
Rob,

Risposte:


15

La maggior parte delle shell utilizzate nei moderni ambienti UNIX sono concepite per essere conformi alle specifiche sh POSIX. POSIX sh deriva dalla shell Korn originale (ksh88), che a sua volta deriva dalla shell Bourne precedente, ma POSIX sh specifica solo un piccolo sottoinsieme della funzionalità di ksh88. In una shell che implementa solo il requisito minimo mancano molte funzionalità richieste per scrivere tutti tranne gli script più banali in modo sicuro e ragionevole. Ad esempio, le variabili e gli array locali sono extra non standard.

Pertanto, il primo motivo è quello di estendere la shell con funzionalità extra. Conchiglie diverse scelgono di concentrarsi su cose diverse. Ad esempio, Zsh si concentra su funzionalità interattive avanzate mentre ksh93 (l'attuale "originale" shell korn) si concentra su potenti funzionalità di programmazione e prestazioni. Anche shell molto minimali come Dash aggiungono almeno alcuni extra non standard come le variabili locali.

Le funzioni extra sono raramente ampiamente interoperabili, se non del tutto. La maggior parte del set di funzionalità di ksh88 è abbastanza ben interoperabile come la sintassi globbing estesa, ma con funzionalità non standard, non ci sono garanzie e devi davvero sapere cosa stai facendo per usarle in modo portatile.

La seconda ragione è l'eredità. Esistono ancora molti Unix proprietari che usano antiche implementazioni non standard per il loro / bin / sh. Fino a poco tempo fa, Solaris utilizzava ancora Bourne come valore predefinito e ha scelto di mantenere la shell Heirloom piuttosto che passare a qualcosa di moderno. Questi sistemi di solito sono dotati di diverse shell a cui è possibile passare, ad esempio modificando la variabile PATH o modificando gli shebang all'interno dei singoli script.

Quindi per riassumere. Esistono più shell, spesso per impostazione predefinita:

  • Per funzionalità extra, in particolare per gestire extra non portatili.
  • Gestire script legacy che spesso non vengono mantenuti.
  • dimensioni / prestazioni. I sistemi integrati richiedono spesso piccole shell come mksh o busybox sh.
  • Ragioni di licenza. AT&T ksh era un software proprietario fino al 2000 circa. Questo è in gran parte ciò che ha dato origine a tutti i cloni simili a ksh come Zsh e Bash.
  • Altre ragioni storiche. Sebbene oggi non sia molto popolare, ci sono stati tentativi radicali di ridisegnare la lingua, come scsh ed es. La funzione di sostituzione del processo di molte shell originariamente proviene da rc (con una sintassi leggermente diversa) e dall'ampliamento dell'espansione da csh. Conchiglie diverse hanno combinazioni diverse di tali funzionalità disponibili, di solito con alcune differenze sottili o non così sottili.

2
Si noti che sebbene localnon sia POSIX o Unix, è specificato e richiesto nello standard Linux (LSB) e nello standard delle politiche debian . Si noti che esè un follow-up su rc.
Stéphane Chazelas,

1
Quello che ora è mkshnato come Public Domain Bourne Shell, che è stato anche scritto per motivi di licenza. (Questi problemi rimangono ancora: le licenze, la portabilità e le dimensioni sono i tre fattori che mi hanno aiutato a convincere Google a includere mksh con Android.)
mirabilos,

19

Perché le persone hanno esigenze diverse ed è bene avere alternative che si adattino alle tue esigenze in una determinata situazione. Una shell è solo uno strumento a sé stante e dovrebbe essere sostituibile da qualsiasi altra a mio avviso. Questo è il potere di Unix / Linux, al contrario di ciò che Microsoft Windows ha scelto di essere.

Allo stesso modo ... Perché ci sono così tanti editor di testo? Perché le persone sviluppano un nuovo browser se ce n'è già uno? Perché ci sono GNOME, KDE, Xfce, LXDE, E17, ecc.?


12
Precisamente. Ci si potrebbe chiedere "perché così tanti gestori di finestre?" anche. Un nativo unix potrebbe porre la domanda opposta: perché solo un CMD.EXE? Perché Windows è così rigido e non personalizzabile?
Bruce Ediger,

1
@BruceEdiger Cosa intendi con solo un cmd.exe? Ci sono alternative, se vuoi usarle. Anche Microsoft stessa ha PowerShell in alternativa.
Malcolm,

3
Anche COMMAND.COMin DOS era sostituibile. Tuttavia, spesso hai un sistema molto fragile a causa dei presupposti di altre applicazioni (e di altri utenti). Di conseguenza, ci sono poche alternative di successo a CMD.EXE. Uno è PowerShell, che ha l'inerzia del supporto di Microsoft. Un altro esempio è, stranamente, bashdovuto al supporto decente della comunità Cygwin, per non parlare della gente del MinGW. Per quanto riguarda i gestori di finestre, Windows ne ha avuto solo uno alla volta, ma ci sono stati diversi nel tempo mentre l'ambiente Windows stesso si è evoluto.
RBerteig,

+1 per questa risposta. Penso che sia per questo che abbiamo tanti diversi gusti UNIX diversificati: AIX, HP-UX, Solaris, Tru64, IRIX, UnixWare, OS X, Linux, FreeBSD, NetBSD, OpenBSD, ... lo chiami!
tonga,

4

Risposta breve

A causa di una strana storia delle licenze, nessuna singola entità ha sviluppato Unix. È stato un processo comunitario a cui hanno partecipato sia volontari che aziende. Queste entità non condividevano sempre tutti i loro strumenti, quindi avvenivano shell separate. Quando ci siamo resi conto di quanto controproducente fosse, era troppo tardi per unificare tutti i gusci in uso. Invece è stato fatto del lavoro per garantire che tutte queste shell siano (teoricamente) compatibili tra loro .

La lunga risposta è complessa e strettamente legata alla storia di Unix stessa. Non è possibile che rimanga su una singola risposta in questa pagina, ma è stato ampiamente (mis) documentato. Troverai risposte più dettagliate e precise guardando nel web e nei libri che trattano della storia di Unix.


2

Esistono diverse shell per gli stessi motivi di diversi browser Web: ognuno ha una preferenza e alcune shell hanno un bagaglio storico o un momento. Ognuno ha caratteristiche e idiosincrasie diverse.


1

Principalmente, la storia ...

Bourne è stato sviluppato come parte della (proprietà) SysV Unix, mentre BSD ha usato csh... Successivamente, bash è stato sviluppato come alternativa open source alla shell Bourne (e le sue versioni migliorate, come ksh). Una shell tipo Bourne è stata adottata nello standard POSIX. ksh è conforme e bash può essere conforme.

Le shell piacciono cshed tcshè molto più facile da usare in modo interattivo rispetto alla shell Bourne originale (che non ha il completamento del comando, ecc.) Ma sono orribili per gli script ...

In alcuni ambienti, come i sistemi embedded basati su Unix, le funzionalità di scripting, le dimensioni e la velocità sono più importanti delle funzionalità interattive come il completamento dei comandi e si tende a utilizzare una variante diversa delle shell.

Per gli script portatili, è necessario utilizzare una variante Bourne conforme a POSIX ed evitare le estensioni.


3
-1 per aver pensato che il mondo fosse iniziato al SysV. La shell Bourne fu rilasciata in UNIX v7 nel 1977, sei anni prima del rilascio di SysV.
Rob,

@ Rob, S / 1977, / 1979, /
Stéphane Chazelas

Abbastanza giusto ... La storia di * nix è piuttosto complicata ... Vedi en.wikipedia.org/wiki/File:Unix_history-simple.svg
Gert van den Berg
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.