Qu'est-ce que / bin / dash?

27

Je pensais que /bin/shc'était un lien symbolique vers ma coquille de choix. Je l'ai toujours utilisé bash, alors j'ai supposé que /bin/shcela indiquerait /bin/bash. Il s'avère, cependant, qu'il pointe /bin/dash.

Ça devient plus drôle. Je commence dashet fais echo $SHELLet il s'imprime /bin/bash(donc ils sont fondamentalement les mêmes?). Cependant, la page de manuel de dashest complètement différente de la page de manuel de bash(donc ce n'est pas la même chose?).

aioobe
la source
1
@wzzrd, cette question est-elle spécifique à Linux?
aioobe
1
soupir, je ne peux pas voter contre toutes ces belles réponses, car j'ai besoin de 15 répétitions. Je me sens handicapé car j'ai 18k sur stackoverflow: - /
aioobe
4
mmm dash .. qu'en est-il de / bin / crash (pour les fans de gdb), / bin / slash (un programme d'austérité), / bin / mash (temps difficiles en Corée), / bin / sash (pour les pom-pom girls), / bin / thrash (dur sur votre disque dur), / bin / flash (mais seulement si vous cryptez vos données), / bin / stash (bonne chance pour le trouver plus tard), / bin / cash (vous êtes toujours dans l'argent), / bin / pash (romancing le PC), / bin / gash (aaargggh!).
PP.
2
@PP - Je lirais / bin / thrash pour les fans de musique Metal et / bin / slash pour les fans des guitaristes du groupe de rock des années 80 ... :-P
gWaldo
1
La raison de l' echo $SHELLimpression /bin/bashest que cette variable est définie pour le shell par défaut qui démarre lorsque vous vous connectez plutôt que le shell actuel que vous exécutez. Démarrez ksh ou zsh à partir d'une invite Bash et echo $SHELLdira toujours /bin/bash. Utilisez pspour voir ce qui est en cours d'exécution.
pause jusqu'à nouvel ordre.

Réponses:

43

Debian et Ubuntu sont passés à dash (iirc) en raison de plusieurs choses. Tout d'abord, Bash est devenu grand au fil des ans. En fait, le /bin/bashbinaire de mon système Ubuntu 8.04 est presque dix fois (!) Aussi gros que /bin/dash. Maintenant, cela n'a pas beaucoup d'importance pour l'utilisation quotidienne du shell, mais cela a de l'importance dans les situations suivantes:

  • Dash est beaucoup plus petit et se charge donc plus rapidement, ce qui est une aubaine pour les scripts d'initialisation. Si vous devez en démarrer beaucoup, le chargement de Dash au lieu de Bash à chaque fois, accélère considérablement les choses.
  • En raison de la plus petite taille de Dash, Debian et Ubuntu sont capables de raser une assez grande partie de la taille de leur initrd, laissant plus de place pour d'autres choses (et encore une fois, accélérant les choses).

L'inconvénient d'utiliser Dash au lieu de Bash pour l'écriture de scripts, c'est que beaucoup de gens utilisent des subtilités syntaxiques que seul Bash possède, les soi-disant Bashismes . Des exemples de bashismes sont des sous-chaînes, comme ceci:

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

Et ça:

echo ${a#123}
4567890

Dash, d'autre part vise principalement à être conforme à POSIX (et pas plus que cela), vous donnera une erreur de mauvaise sous-station si vous essayez ceci:

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

Cela importera si vous utilisez /bin/sh(et donc dash) comme interprète pour vos scripts shells et utilisez des bashismes dans ceux-ci. Debian et Ubuntu ont de belles pages wiki sur les bashismes et pourquoi ils sont mauvais dans les scripts shell en général et les scripts init en particulier. Par conséquent, vous devez consciemment choisir si vous avez besoin /bin/shou /bin/bashcomme interprète pour votre script.

Dash n'est pas censé être utilisé comme shell par défaut sur vos systèmes. Utilisez simplement Bash pour cela. Pour la portabilité de vos scripts, vous pouvez utiliser Dash comme interprète pour augmenter les chances que les scripts s'exécutent sur d'autres versions Linux et Unix.

wzzrd
la source
1
Si vous écrivez des scripts avec des bashismes, veuillez préciser /bin/bash; de nombreux systèmes non Linux ont de véritables shshells qui ne sont même pas compatibles avec bash.
Chris S
echo ${a#123}n'est pas un bashisme, il fait partie de la spécification d'extension POSIX Parameter. pubs.opengroup.org/onlinepubs/009695399/utilities/… Vous n'obtenez tout simplement pas les styles Bash les plus avancés, les posix sont de style sous-chaîne + caractères d'extension simples. Signification, POSIX permet égalementecho ${a#*6}
JM Becker
0

Comme tous les shells ne sont pas définis $SHELLlors de l'exécution, vous découvrez votre shell actuel avec:

echo $0

S'il donne une erreur, c'est csh, sinon c'est le argv[0]avec lequel vous avez été invoqué, qui est généralement le shell, peut-être avec un -trait d'union, pour indiquer qu'il s'agit d'un shell de connexion.

Ce n'est pas garanti , car il argv[0]est sous le contrôle du processus d'appel, mais c'est en pratique l'approche la plus fiable.

Phil P
la source