Qual è il punto in cui sh è collegato al trattino?


36

Mi chiedo quale sia il punto di shessere simbolico collegato dash? Capisco che dashdovrebbe essere più veloce di bash, ma non sono sicuro del perché la shshell originale non sia presente sh.

O se mai perché non è shcollegato bash?

Risposte:


72

La risposta breve al "perché la shell sh originale non è presente sh" è che non c'è sh originale.

Bene, ok, c'è: è la shell Thompson . La versione 1 aveva alcune delle caratteristiche che conosciamo oggi, in particolare il reindirizzamento e le pipe (leggi l'articolo di Dennis Ritchie sulla prima storia di Unix ). Le versioni successive hanno aggiunto funzionalità come l'esecuzione in background con &, globbing (implementato con un programma esterno) e alcune forme di quotazione, ma non aveva variabili o strutture di controllo nidificate. I condizionali e i loop sono stati forniti tramite programmi esterni if(che hanno preso una condizione e un comando come argomenti) e goto(che ha funzionato cambiando la posizione del file del suo genitore nel file di script).

Nel 1979, in Unix V7 , la shell Thompson fu sostituita come /bin/shla shell Bourne . La prima versione aveva già molte delle funzionalità che sono presenti oggi nel dash e le versioni successive ne hanno introdotte molte altre . Qualche anno dopo, la shell Korn è entrata in scena, con un set di funzionalità in crescita; molte varianti Unix lo installarono sotto il nome ksh.

Nel 1992 POSIX ha codificato un set minimo di shfunzionalità che era sostanzialmente Bourne e alcune altre cose. Qualsiasi sistema che si autodefinisse "Unix" doveva implementare almeno queste funzionalità. I sistemi Unix commerciali usavano solitamente ksh come POSIX sh, ma alcuni (ad es. OSF / 1 ) ne avevano uno proprio.

Né la shell Bourne né la shell Korn erano open source fino a poco tempo fa, quindi quando il mondo Linux iniziò a formarsi a metà degli anni '90, non erano disponibili. /bin/shdoveva essere qualcos'altro. La maggior parte delle distribuzioni Linux ha optato per bash , una shell del progetto GNU che tendeva ad essere tra Bourne e Korn in termini di funzionalità di scripting e molto meglio di entrambe per un uso interattivo). L'unica alternativa possibile era pdksh ("shell di dominio pubblico Korn"), un libero (ora fuori produzione, ma vivendo come mksh , che è attivamente sviluppato ), ma non ricordo una distribuzione Linux usando pdksh come/bin/sh, Non so perché, immagino perché le distribuzioni Linux sono sempre state distribuzioni GNU / Linux, sostanzialmente distribuendo versioni GNU di qualsiasi strumento per il quale esisteva una versione GNU.

C'erano anche diverse implementazioni open source di sh"ash", in particolare la shell Almquist , ma erano molto incomplete, prive di alcune funzionalità POSIX che la gente voleva usare. Un programmatore che era un manutentore di Debian, Herbert Xu , ha esteso ash per renderlo conforme a POSIX. Alla fine la sua versione è stata ribattezzata in dash, e c'è stata qualche spinta per farcela /bin/shin Debian anziché bash. Ubuntu è iniziato prima che Debian iniziasse a trattare sistematicamente i bashismi (l'uso della funzionalità specifica di bash negli #!/bin/shscript) come bug . Entrambi sono passati in seguito ( Ubuntu 6.10 , Debian solo nel 2009 ( era un obiettivo per Lenny ma il passaggio è stato effettuato solo dopo il rilascio di lenny, ovvero in compressione)).

Una delle principali ragioni per l'utilizzo di precipitare come piuttosto che bash come /bin/shè che è significativamente più veloce. Ciò è stato particolarmente importante per Ubuntu, che ha cercato di ridurre i tempi di avvio sin dall'inizio. Dash tende anche a usare meno memoria di bash, il che è in qualche modo importante per gli script wrapper che restano in giro solo per fare un po 'di pulizia quando il programma sottostante esce. Un altro vantaggio di dash è che si basa solo su libc (la libreria di sistema principale) mentre bash si basa anche su librerie di supporto terminali (non può avviarsi senza di esse, nemmeno per eseguire uno script); questo significa che il trattino ha maggiori possibilità di continuare a lavorare su un sistema guasto.

Ad un certo punto durante il 21 ° secolo, la shell Korn divenne open source e apparvero versioni open source della shell Bourne (vecchie versioni, perché lo sviluppo era cessato anni prima). Ma dash e bash erano troppo saldamente radicati nel mondo Linux per poter essere accettati, in particolare la shell Bourne poiché il suo valore oggi è solo storico. Dash ha spostato Bash perché aveva chiari benefici, ma nessuno degli altri contendenti ha alcun vantaggio decisivo come /bin/sh.


Direi che ci sono buoni motivi per usare ksh93 come / bin / sh - è una delle shell POSIX ad alte prestazioni disponibili. Concordato che l'ubiquità del trattino è una questione di tempismo.
Charles Duffy,

2
@CharlesDuffy Ksh93 è più veloce nel fare cose complesse, ma il trattino lo batte per i tempi di avvio e per semplici script (come tutte le chiamate a system(3) che le applicazioni fanno) questo è il fattore dominante.
Gilles 'SO- smetti di essere malvagio' il

21

La velocità e la conformità POSIX (in altre parole, portabilità) sono i fattori principali. Ricorda che /bin/shè pensato per gli script di sistema, che possono o no provenire da versioni precedenti di Ubuntu e / o altri sistemi.

Certo, le funzionalità brillanti di bashsono interessanti da usare per noi utenti, ma quando si tratta di eseguire cose in un ambiente in cui è necessario gestire diversi server / sistemi - avere una shell conforme a POSIX fa molta differenza. Soprattutto, se sei un nuovo amministratore di sistema e un ambiente ereditato con molti script.

Per quanto riguarda il motivo per cui la shell Bourne originale non è presente, è semplice: è un prodotto proprietario originariamente di proprietà di AT&T Bell Labs.

Inoltre, c'è una spiegazione esplicita sul wiki di Ubuntu a riguardo:

Perché è stata apportata questa modifica? Il motivo principale per cambiare la shell predefinita era l'efficienza. bash è un'eccellente shell full-optional adatta per l'uso interattivo; in effetti, è ancora la shell di accesso predefinita. Tuttavia, è piuttosto grande e lento da avviare e funzionare rispetto al trattino. Un gran numero di istanze della shell vengono avviate come parte del processo di avvio di Ubuntu. Anziché modificarli singolarmente per eseguire esplicitamente in / bin / dash, un cambiamento che richiederebbe una manutenzione in corso significativa e che potrebbe regredire se non prestasse molta attenzione, il team di sviluppo principale di Ubuntu ha ritenuto che fosse meglio semplicemente cambiare la shell predefinita. I miglioramenti della velocità di avvio in Ubuntu 6.10 sono stati spesso erroneamente attribuiti a Upstart, che è una piattaforma eccellente per lo sviluppo futuro del sistema init ma in Ubuntu 6. 10 era principalmente in esecuzione in modalità di compatibilità System V con solo piccole modifiche comportamentali. Questi miglioramenti erano in gran parte dovuti al cambio / bin / sh.

Ed ecco una nota sulla portabilità:

Il manuale delle politiche di Debian ha da tempo imposto che "gli script di shell che specificano '/ bin / sh' come interprete devono usare solo le funzionalità POSIX"; in effetti, questo requisito è in vigore da molto prima dell'inizio del progetto Ubuntu. Inoltre, qualsiasi script di shell che si aspettava fosse portabile su altri sistemi Unix, come BSD o Solaris, rispettava già questo requisito. Pertanto, abbiamo ritenuto che l'impatto sulla compatibilità di questo cambiamento sarebbe stato minimo.

Vedi https://wiki.ubuntu.com/DashAsBinSh


Non dashsupporta le funzionalità che non sono richieste da POSIX?
NerdOfLinux il

@NerdOfLinux Non importa cosa supporti / bin / sh oltre a POSIX (purché tali aggiunte non rompano gli script POSIX); l'importante è che supporti tutto POSIX (ed è il più veloce possibile). Finché dash soddisfa questi requisiti, / bin / sh può collegarsi ad esso.
Guntram Blohm sostiene Monica il

9

Nelle distribuzioni GNU / Linux, l'originale /bin/shè in realtà Bash.

GNU voleva una shell simile a Bourne che era sotto licenza GPL, quindi è per questo che hanno scelto Bash per loro /bin/sh, invece di Bourne, che non aveva la licenza GPL. Le moderne distribuzioni Linux hanno ereditato questa decisione al punto da diventare uno standard defacto per /bin/shessere Bash. La shell Bourne originale ("sh") è stata utilizzata in altri Unix non Linux, anche di recente come Solaris 10, ma non è mai stata un pilastro delle distribuzioni Linux.

Passare /bin/shda bash a dash è stata una decisione Debian (ereditata da Ubuntu) motivata in gran parte dalla velocità - è arrivata in un momento in cui hanno fatto uno sforzo enorme per migliorare la velocità di avvio, e gran parte del tempo di avvio della CPU al momento coerente con l'esecuzione script init.

Bash continua ad essere usato come shell interattiva / login predefinita per gli utenti, ma Dash è quello in /bin/she quello che viene eseguito per gli script di sistema come gli script di init.

Dash è molto veloce, ma è anche strettamente compatibile con POSIX, uno standard strettamente allineato con la shell Bourne. Quindi, in un certo senso, passando da Bash a Dash stiamo tornando a una shell più strettamente allineata con Bourne.


"Dash è molto veloce, ma è anche strettamente compatibile con POSIX - uno standard che è strettamente allineato con la shell Bourne." Sì, sebbene POSIX sia più strettamente correlato ksh, direi. Non ricordo che la shell Bourne abbia un'espansione aritmetica `$ (())`, che è POSIX.
Sergiy Kolodyazhnyy,

1
Inoltre, in Bourne, ^c'è un personaggio pipe - così echo foo ^ catemetterà foo ^ catin POSIX sh, ma fooin Bourne; questo test specifico è come Autoconf distingue i due.
Charles Duffy,

Interessante, quindi con POSIX sh intendi Korn?
thomasrutter,

0

/bin/shè collegato /bin/dashper ciò che credo siano ragioni di compatibilità. Molti script iniziano semplicemente con

#!/bin/sh

quindi spostandosi dashe non creando un collegamento simbolico, molti script non funzionerebbero correttamente (o affatto) se /bin/shnon esistessero affatto.

La modifica è stata apportata da basha dashperché secondo https://wiki.ubuntu.com/DashAsBinSh :

Il motivo principale per cambiare la shell predefinita era l'efficienza. bash è un'eccellente shell full-optional adatta per l'uso interattivo; in effetti, è ancora la shell di accesso predefinita. Tuttavia, è piuttosto grande e lento da avviare e funzionare rispetto al trattino. Un gran numero di istanze della shell vengono avviate come parte del processo di avvio di Ubuntu. Anziché modificarli singolarmente per eseguire esplicitamente in / bin / dash, un cambiamento che richiederebbe una manutenzione in corso significativa e che potrebbe regredire se non prestasse molta attenzione, il team di sviluppo principale di Ubuntu ha ritenuto che fosse meglio semplicemente cambiare la shell predefinita.

shnon è collegato a bash, perché

Il manuale delle politiche di Debian ha da tempo imposto che "gli script di shell che specificano '/ bin / sh' come interprete devono usare solo le funzionalità POSIX"

Se vuoi usare bashcome /bin/sh:

Se i problemi sono più diffusi e si desidera ripristinare la shell di sistema predefinita, è possibile indicare al sistema di gestione dei pacchetti di interrompere l'installazione del trattino come / bin / sh:

sudo dpkg-reconfigure dash

Ci sono alcune funzionalità che dashprevedono che bash non lo sia, in quanto:

c'è anche una possibilità esterna che ci siano alcuni script che ora dipendono da alcune funzionalità di dash che bash non fornisce!


Ho già capito che la compatibilità può essere un fattore ma stavo cercando una risposta non così ovvia e più approfondita ...
NerdOfCode

2
Quindi, se dovessi installare la Bourne shell originale sha /bin/sh, sarebbe questa vite su quei script di boot?
dessert

Probabilmente è meglio provare questo in una macchina virtuale prima di distribuirlo nel mondo reale ...
NerdOfCode

2
Dovresti lasciare /bin/shla shell fornita dalla distribuzione poiché è quello che hanno preso di mira con i loro script di avvio e simili. Ma se lo sostituissi con Bourne, sarebbe per lo più compatibile. Immagino che ci sarebbero rotture, solo a causa di differenze minime rispetto alla pura quantità di codice. Ovviamente sei libero di usare qualunque shell nei tuoi script con un hashbang personalizzato.
thomasrutter,

1
@mckenzm A quale shell si /bin/shcollega è separato da quale uno specifico utente ha impostato come shell di login iniziale. L'obiettivo di /bin/shnon dipende da quale utente sta guardando, e si fa necessità di utilizzare sudo--o altri mezzi di agire come utente root - per cambiarlo. Inoltre, in generale e per qualsiasi pacchetto, dpkg-reconfiguredeve essere eseguito come root. Al contrario, gli utenti sono generalmente autorizzati a modificare la propria shell di accesso iniziale e possono farlo con il chshcomando. Anche il nome della propria shell di accesso iniziale viene inserito $SHELLe viene utilizzato anche per alcune shell interattive non di accesso.
Eliah Kagan,
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.