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

19

Mi chiedo quale sia il punto di sh che è collegato simbolicamente a dash ? Comprendo che dash dovrebbe essere più veloce di bash , ma non sono sicuro del motivo per cui la shell sh originale non è presente in sh .

O se non altro perché sh è collegato a bash ?

    
posta NerdOfCode 14.11.2017 - 23:20

4 risposte

50

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

Bene, ok, c'è: è la shell Thompson . La versione 1 aveva alcune delle funzionalità che conosciamo oggi, in particolare il reindirizzamento e le pipe (leggi il testo di Dennis Ritchie su la storia di Unix in anticipo ). Versioni successive ha aggiunto funzionalità come l'esecuzione in background con & , globbing (implementato con un programma esterno ) e alcune forme di quoting, ma non aveva variabili o strutture di controllo annidate. Le condizioni e i loop venivano forniti tramite programmi esterni if (che richiedeva una condizione e un comando come argomenti) e < a href="https://etsh.io/man/goto.1.txt"> goto (che ha funzionato cambiando la posizione del file del suo genitore nel file di script).

Nel 1979, in Unix V7 , la shell di Thompson fu sostituita come /bin/sh dal Bourne shell . La prima versione aveva già molte delle funzionalità presenti in dash oggi e le versioni successive introdotte molti altri . Alcuni anni dopo, la shell Korn è entrata in scena, con un set di funzionalità in crescita; molte varianti Unix l'hanno installato sotto il nome ksh .

Nel 1992, POSIX ha codificato un set minimo di sh di funzionalità sostanzialmente Bourne più alcune cose. Qualsiasi sistema che si chiamava "Unix" doveva implementare almeno queste funzionalità. I sistemi Unix commerciali usavano solitamente ksh come POSIX sh, ma alcuni (es. OSF / 1 ) avevano i loro proprio.

Né la shell Bourne né la shell Korn erano open source fino a poco tempo fa, quindi quando il mondo Linux ha iniziato a formarsi a metà degli anni '90, non erano disponibili. /bin/sh doveva essere qualcos'altro. La maggior parte delle distribuzioni Linux è stata utilizzata per bash , una shell di Progetto GNU che tendeva ad essere tra Bourne e Korn in termini di funzionalità di scripting, e molto meglio di entrambi per l'uso interattivo). L'unica alternativa valida era pdksh ("public domain Korn shell"), una versione gratuita (ora fuori produzione, ma vivibile come mksh , che è sviluppato attivamente ), ma non ricordo una distribuzione Linux che usa pdksh come /bin/sh , non lo so perché, immagino perché le distribuzioni Linux erano sempre distribuzioni GNU / Linux, fondamentalmente distribuendo versioni GNU di qualsiasi strumento per il quale esisteva una versione GNU.

C'erano anche diverse implementazioni open source di sh chiamate "ash", in particolare la shell di Almquist , ma erano molto incompleti, privi di alcune caratteristiche POSIX che le persone volevano usare. Un programmatore che era un manutentore Debian, Herbert Xu , ha esteso la cenere per renderlo conforme a POSIX. Alla fine la sua versione è stata rinominata in dash e c'è stato un po 'di push per renderlo /bin/sh in Debian invece che bash. Ubuntu ha iniziato prima che Debian iniziasse a trattare sistematicamente i bashismi (l'uso della funzionalità specifica di bash in% script% di script) come bug . Entrambi sono passati in un secondo momento ( Ubuntu 6.10 , solo per Debian nel 2009 ( era un obiettivo per lenny ma l'interruttore è stato eseguito solo dopo il rilascio di lenny, ovvero in squeeze)).

Un importante motivo per utilizzare dash come anziché bash come #!/bin/sh è che è significativamente più veloce. Questo è stato particolarmente importante per Ubuntu, che ha cercato di mantenere i tempi di avvio brevi dall'inizio. Dash tende anche ad usare meno memoria di bash, il che è piuttosto importante per gli script wrapper che restano intorno solo per fare un po 'di pulizia quando il programma sottostante si chiude. Un altro vantaggio di dash è che si basa solo su libc (la libreria di base del sistema) mentre bash si basa anche sulle librerie di supporto del terminale (non può iniziare senza di esse, anche per eseguire uno script); questo significa che il trattino ha una migliore possibilità di continuare a lavorare su un sistema guasto.

Ad un certo punto del 21 ° secolo, la shell di 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 farli accettare, specialmente la shell Bourne, dal momento che il suo valore oggi è solo storico. Dash ha spostato bash perché ha avuto chiari benefici, ma nessuno degli altri contendenti ha un vantaggio decisivo come /bin/sh .

    
risposta data Gilles 15.11.2017 - 00:48
18

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

Certo, le funzioni brillanti di bash sono fantastiche da usare per noi utenti, ma quando si tratta di eseguire cose in ambiente in cui devi gestire diversi server / sistemi, la 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 - si tratta di un prodotto proprietario originariamente di proprietà di AT & amp; T Bell Labs.

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

  

Perché è stata apportata questa modifica?   Il motivo principale per cambiare la shell di default era l'efficienza. bash è un'eccellente shell con funzionalità complete adatta per l'uso interattivo; infatti, è ancora la shell di login predefinita. Tuttavia, è piuttosto grande e lento da avviare e funzionare rispetto al dash. Un gran numero di istanze di shell vengono avviate come parte del processo di avvio di Ubuntu. Anziché modificarli singolarmente per eseguirli esplicitamente sotto / bin / dash, una modifica che richiederebbe una manutenzione continua significativa e che sarebbe suscettibile di regredire se non fosse prestata attenzione, il team di sviluppo di Ubuntu sentiva che era meglio cambiare semplicemente la shell di default. I miglioramenti della velocità di avvio in Ubuntu 6.10 erano spesso erroneamente attribuiti a Upstart, che è una buona piattaforma 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. In realtà questi miglioramenti erano in gran parte dovuti al cambio / bin / sh.

Ed ecco una nota sulla portabilità:

  

Il manuale della politica Debian ha da tempo stabilito che "gli script della shell che specificano '/ bin / sh' come interprete devono usare solo le caratteristiche POSIX"; in effetti, questo requisito è in vigore da molto prima dell'inizio del progetto Ubuntu. Inoltre, qualsiasi script di shell che si pensava potesse essere trasferito su altri sistemi Unix, come i BSD o Solaris, aveva già onorato questo requisito. Pertanto, abbiamo ritenuto che l'impatto sulla compatibilità di questo cambiamento sarebbe minimo.

Vedi link

    
risposta data Sergiy Kolodyazhnyy 15.11.2017 - 00:19
8

Nelle distribuzioni GNU / Linux, "% originale%" è in realtà Bash.

GNU voleva una shell di tipo Bourne che era sotto la GPL, ecco perché hanno scelto Bash per il loro /bin/sh , invece di Bourne, che non era con licenza GPL. Le moderne distribuzioni Linux hanno ereditato questa decisione al punto da diventare uno standard de facto per /bin/sh per essere Bash. La shell Bourne originale ("sh") è stata usata in altri Unix non Linux, anche recentemente come Solaris 10, ma non è mai stata un pilastro nelle distribuzioni Linux.

Cambiare /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 un enorme sforzo per migliorare la velocità di avvio e gran parte del tempo di avvio della CPU al momento coerente con l'esecuzione degli script di init.

Bash continua ad essere utilizzato 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 molto strettamente compatibile con POSIX - uno standard allineato strettamente con la shell Bourne. Quindi, in un certo senso, passando da Bash a Dash torniamo a una shell più strettamente allineata a Bourne.

    
risposta data thomasrutter 15.11.2017 - 00:30
0

/bin/sh è collegato a /bin/dash per quelli che credo siano motivi di compatibilità. Molti script iniziano semplicemente con

#!/bin/sh

quindi spostandoti su dash e non creando un collegamento simbolico, molti script non funzionerebbero correttamente (o del tutto) se /bin/sh non esistesse affatto.

La modifica è stata apportata da bash a dash perché in base al link :

  

Il motivo principale per cambiare la shell di default era l'efficienza. bash è un'eccellente shell con funzionalità complete adatta per l'uso interattivo; infatti, è ancora la shell di login predefinita. Tuttavia, è piuttosto grande e lento da avviare e funzionare rispetto al dash. Un gran numero di istanze di shell vengono avviate come parte del processo di avvio di Ubuntu. Anziché modificarli singolarmente per eseguirli esplicitamente sotto / bin / dash, una modifica che richiederebbe una manutenzione continua significativa e che sarebbe suscettibile di regredire se non fosse prestata attenzione, il team di sviluppo di Ubuntu sentiva che era meglio cambiare semplicemente la shell predefinita.

sh non è collegato a bash , perché

  

Il manuale della politica Debian ha da tempo il mandato che "gli script della shell che specificano '/ bin / sh' come interprete devono usare solo le caratteristiche POSIX"

Se vuoi utilizzare bash come /bin/sh :

  

Se i problemi sono più diffusi e vuoi cambiare la shell di sistema di default, puoi istruire il sistema di gestione dei pacchetti a smettere di installare dash come / bin / sh:

sudo dpkg-reconfigure dash

Ci sono alcune funzionalità che dash fornisce che bash non ha, come:

  

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

    
risposta data NerdOfLinux 14.11.2017 - 23:23

Leggi altre domande sui tag