Qual è la differenza tra #!/ bin / sh e #!/ bidone / bash?

Su Linux e altri sistemi Unix-like hai una scelta di shell multiple.

La shell è responsabile non solo del disegno del tuo piccolo prompt, ma dell’interpretazione dei tuoi comandi, specialmente se inserisci logiche complicate come pipe, condizionali e così via.

bash è la shell più comune utilizzata come shell predefinita per gli utenti di sistemi Linux. È un discendente spirituale di altre shell utilizzate nella storia di Unix. Il suo nome, bash è un’abbreviazione di Bourne-Again Shell, un omaggio alla shell Bourne è stato progettato per sostituire, anche se incorpora anche caratteristiche dalla Shell C e la Shell Korn.

È eseguito, in questi giorni, da /bin/bash – qualsiasi sistema con bash lo avrà accessibile qui.

Non sono solo gli utenti che usano le shell, però. Gli script (script di shell) hanno bisogno di shell per interpretarli. Quando si esegue uno script di shell, il sistema deve avviare un processo di shell per eseguire lo script.

Il problema è che diverse shell hanno piccole piccole incongruenze tra di loro, e quando si tratta di eseguire script, questi possono essere un vero problema. bash ha un sacco di funzioni di scripting che sono uniche solo per bash e non per altre shell. Questo va bene, se hai sempre intenzione di usare bash per eseguire quegli script. Altre shell possono provare a emulare bash o aderire allo standard POSIX, che bash supporta abbastanza bene (anche se aggiunge le proprie estensioni).

È possibile specificare nella parte superiore di uno script di shell con quale shell deve essere eseguito utilizzando una shebang. Uno script può specificare #!/bin/bash sulla prima riga, il che significa che lo script deve sempre essere eseguito con bash, piuttosto che con un’altra shell.

/bin/sh è un eseguibile che rappresenta la shell di sistema. In realtà, di solito è implementato come un collegamento simbolico che punta all’eseguibile per qualsiasi shell sia la shell di sistema. La shell di sistema è una sorta di shell predefinita che gli script di sistema dovrebbero usare. Nelle distribuzioni Linux, per molto tempo questo era solitamente un collegamento simbolico a bash, tanto che è diventato un po ‘ una convenzione per collegare sempre /bin/sh a bash o una shell compatibile con bash. Tuttavia, negli ultimi due anni Debian (e Ubuntu) hanno deciso di cambiare la shell di sistema da bash a dash – una shell simile – rompendo con una lunga tradizione in Linux (beh, GNU) di usare bash per /bin/sh. Dash è visto come una shell più leggera e molto più veloce, che può essere utile per la velocità di avvio (e altre cose che richiedono molti script di shell, come gli script di installazione dei pacchetti).

Dash è abbastanza compatibile con bash, essendo basato sullo stesso standard POSIX. Tuttavia, non implementa le estensioni specifiche di bash. Esistono script che usano #!/bin/sh (la shell di sistema) come loro shebang, ma che richiedono estensioni specifiche di bash. Questo è attualmente considerato un bug che dovrebbe essere risolto da Debian e Ubuntu, che richiedono /bin/sh per poter funzionare quando punta a dash.

Anche se la shell di sistema di Ubuntu punta a dash, la tua shell di accesso come utente continua ad essere bash in questo momento. Cioè, quando accedi a un emulatore di terminale ovunque in Linux, la tua shell di accesso sarà bash. La velocità di funzionamento non è tanto un problema quando la shell viene utilizzata in modo interattivo e gli utenti hanno familiarità con bash (e possono avere personalizzazioni specifiche di bash nella loro directory home).

Cosa dovresti usare quando scrivi script

Se il tuo script richiede funzionalità supportate solo da bash, usa #!/bin/bash.

Ma se possibile, sarebbe bene assicurarsi che lo script sia compatibile con POSIX e utilizzare #!/bin/sh, che dovrebbe sempre, in modo abbastanza affidabile, puntare alla shell di sistema compatibile con POSIX preferita in qualsiasi installazione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.