Mi chiedo quale sia il punto di sh
essere simbolico collegato dash
? Capisco che dash
dovrebbe essere più veloce di bash
, ma non sono sicuro del perché la sh
shell originale non sia presente sh
.
O se mai perché non è sh
collegato bash
?
Mi chiedo quale sia il punto di sh
essere simbolico collegato dash
? Capisco che dash
dovrebbe essere più veloce di bash
, ma non sono sicuro del perché la sh
shell originale non sia presente sh
.
O se mai perché non è sh
collegato bash
?
Risposte:
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/sh
la 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 sh
funzionalità 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/sh
doveva 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/sh
in Debian anziché bash. Ubuntu è iniziato prima che Debian iniziasse a trattare sistematicamente i bashismi (l'uso della funzionalità specifica di bash negli #!/bin/sh
script) 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
.
system
(3) che le applicazioni fanno) questo è il fattore dominante.
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 bash
sono 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.
dash
supporta le funzionalità che non sono richieste da POSIX
?
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/sh
essere 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/sh
da 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/sh
e 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.
ksh
, direi. Non ricordo che la shell Bourne abbia un'espansione aritmetica `$ (())`, che è POSIX.
^
c'è un personaggio pipe - così echo foo ^ cat
emetterà foo ^ cat
in POSIX sh, ma foo
in Bourne; questo test specifico è come Autoconf distingue i due.
/bin/sh
è collegato /bin/dash
per ciò che credo siano ragioni di compatibilità. Molti script iniziano semplicemente con
#!/bin/sh
quindi spostandosi dash
e non creando un collegamento simbolico, molti script non funzionerebbero correttamente (o affatto) se /bin/sh
non esistessero affatto.
La modifica è stata apportata da bash
a dash
perché 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.
sh
non è 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 bash
come /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 dash
prevedono 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!
sh
a /bin/sh
, sarebbe questa vite su quei script di boot?
/bin/sh
la 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.
/bin/sh
collega è separato da quale uno specifico utente ha impostato come shell di login iniziale. L'obiettivo di /bin/sh
non 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-reconfigure
deve essere eseguito come root. Al contrario, gli utenti sono generalmente autorizzati a modificare la propria shell di accesso iniziale e possono farlo con il chsh
comando. Anche il nome della propria shell di accesso iniziale viene inserito $SHELL
e viene utilizzato anche per alcune shell interattive non di accesso.