Che cos'è / bin / dash?


27

Pensavo /bin/shfosse un collegamento simbolico al mio guscio preferito. L'ho sempre usato bash, quindi ho pensato che /bin/shsarebbe stato utile /bin/bash. Si scopre, tuttavia, che indica /bin/dash.

Diventa più divertente. Comincio dashe faccio echo $SHELLe stampa /bin/bash(quindi sono sostanzialmente uguali?). Tuttavia, la pagina man di dashè completamente diversa dalla pagina man di bash(in modo che siano non la stessa cosa?).


1
@wzzrd, questa domanda è specifica per Linux?
aioobe,

1
sospiro, non posso votare tutte queste belle risposte, dato che ho bisogno di 15 rappresentanti. Mi sento handicappato perché ho 18k su StackOverflow: - /
aioobe,

4
mmm dash .. che dire di / bin / crash (per i fan di gdb), / bin / slash (un programma di austerità), / bin / mash (tempi difficili in Corea), / bin / sash (per cheerleader), / bin / thrash (difficile sul tuo HDD), / bin / flash (ma solo se crittografi i tuoi dati), / bin / stash (buona fortuna per trovarli in seguito), / bin / cash (sei sempre in-the-money), / bin / pash (romancing il PC), / bin / gash (aaargggh!).
PP.

2
@PP - Leggo / bin / thrash per i fan della musica metal e / bin / slash per i fan dei chitarristi della rock band degli anni '80 ... :-P
gWaldo

1
Il motivo viene echo $SHELLstampato /bin/bashperché quella variabile è impostata per la shell predefinita che inizia quando si effettua il login anziché la shell corrente in esecuzione. Avvia ksh o zsh da un prompt di Bash e echo $SHELLcontinuerà a dire /bin/bash. Usa psper vedere cosa è attualmente in esecuzione.
In pausa fino a nuovo avviso.

Risposte:


43

Debian e Ubuntu sono passati al trattino (iirc) a causa di un paio di cose. Prima di tutto, Bash è diventato grande nel corso degli anni. In effetti, il /bin/bashbinario sul mio sistema Ubuntu 8.04 è quasi dieci volte (!) Grande quanto /bin/dash. Ora, questo non ha molta importanza per l'uso quotidiano della shell, ma è importante nelle seguenti situazioni:

  • Dash è molto più piccolo e quindi si carica più velocemente, il che è un vantaggio per init-script. Se devi avviarne molti, caricando Dash anziché Bash ogni volta, acceleri notevolmente le cose.
  • A causa delle dimensioni più ridotte di Dash, Debian e Ubuntu sono in grado di radere un grosso pezzo delle dimensioni del loro initrd, lasciando più spazio per altre cose (e ancora, accelerando le cose).

Il rovescio della medaglia dell'uso di Dash invece di Bash per lo scripting è che molte persone usano le cose sintattiche che solo Bash ha, i cosiddetti Bashisms . Esempi di bashismi sono sottostringhe, come questa:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

E questo:

echo ${a#123}
4567890

Dash, d'altra parte, mira principalmente a essere conforme a POSIX (e non di più), ti darà un errore di sottostizione Bad se provi questo:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

Ciò avrà importanza se usi /bin/sh(e quindi dash) come interprete per i tuoi shellscript e usi Bashisms in essi. Debian e Ubuntu hanno belle pagine wiki su Bashisms e perché sono cattive negli script shell in generale e negli script init in particolare. Pertanto, dovresti scegliere consapevolmente se hai bisogno /bin/sho /bin/bashcome interprete per la tua sceneggiatura.

Dash non dovrebbe essere usato come shell predefinita sui tuoi sistemi. Usa Bash per questo. Per la portabilità dei tuoi script, puoi usare Dash come interprete per aumentare le probabilità che gli script verranno eseguiti su altre versioni Linux e Unix.


1
Se scrivi script con Bashisms, specifica /bin/bash; molti sistemi non Linux hanno shshell reali che non sono nemmeno vicine a quelle compatibili bash.
Chris S,

echo ${a#123}non è un bashismo, fa parte delle specifiche di espansione dei parametri POSIX. pubs.opengroup.org/onlinepubs/009695399/utilities/… Non hai i Bash in stile sed più avanzati, I posix sono stile di sottostringa + semplici caratteri di espansione. Significato, POSIX consente ancheecho ${a#*6}
JM Becker



0

Poiché non tutte le shell vengono impostate $SHELLdurante l'esecuzione, scopri la shell corrente con:

echo $0

Se dà un errore, è csh, altrimenti è quello con cui argv[0]sei stato invocato, che di solito è la shell, forse con un -trattino iniziale, per indicare che è una shell di accesso.

Ciò non è garantito , poiché argv[0]è sotto il controllo del processo di invocazione, ma è in pratica l'approccio più affidabile.

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.