O que é / bin / dash?

27

Eu pensei que /bin/shera um link simbólico para a minha concha de escolha. Eu sempre usei bash, então assumi que /bin/shisso apontaria /bin/bash. Acontece, porém, que ele aponta /bin/dash.

Fica mais engraçado. Começo dashe faço echo $SHELLe ele imprime /bin/bash(então são basicamente os mesmos?). No entanto, a página de manual de dashé completamente diferente da página de manual de bash(portanto, elas não são as mesmas?).

aioobe
fonte
11
@ wzzrd, esta pergunta é específica para Linux?
aioobe
11
suspiro, não posso aprovar todas essas respostas legais, pois preciso de 15 representantes. Sinto-me deficiente como eu tenho 18k no stackoverflow: - /
aioobe
4
mmm dash .. e quanto a / bin / crash (para fãs de gdb), / bin / slash (um programa de austeridade), / bin / mash (tempos difíceis na Coréia), / bin / sash (para líderes de torcida), / bin / thrash (rígido no seu disco rígido), / bin / flash (mas somente se você criptografar seus dados), / bin / stash (boa sorte para encontrá-lo mais tarde), / bin / cash (você está sempre com o dinheiro), / bin / pash (romanceizando o PC), / bin / gash (aaargggh!).
PP.
2
@PP - Eu lia / bin / thrash para fãs de música Metal e / bin / slash para fãs de guitarristas da banda de rock dos anos 80 ... :-P
gWaldo
11
A razão pela qual echo $SHELLimpressões /bin/bashé porque essa variável é definida para o shell padrão que começa quando você entra em vez do shell atual você está executando. Inicie o ksh ou zsh a partir de um prompt do Bash e echo $SHELLcontinuará dizendo /bin/bash. Use pspara ver o que está em execução no momento.
Pausado até novo aviso.

Respostas:

43

O Debian e o Ubuntu mudaram para o dash (iirc) por causa de algumas coisas. Primeiro de tudo, Bash se tornou grande ao longo dos anos. Na verdade, o /bin/bashbinário no meu sistema Ubuntu 8.04 é quase dez vezes maior que o /bin/dash. Agora, isso não importa muito para o uso diário do shell, mas importa nas seguintes situações:

  • O Dash é muito menor e, portanto, é carregado mais rapidamente, o que é um benefício para os scripts de inicialização. Se você precisar iniciar muitos deles, carregar o Dash em vez do Bash a cada vez acelera consideravelmente as coisas.
  • Devido ao tamanho menor do Dash, o Debian e o Ubuntu são capazes de cortar uma grande parte do tamanho do initrd, deixando mais espaço para outras coisas (e, novamente, acelerando as coisas).

A desvantagem de usar o Dash em vez do Bash para scripts é que muitas pessoas usam sutilezas sintáticas que somente o Bash possui, os chamados Bashisms . Exemplos de Bashisms são substrings, como este:

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

E isto:

echo ${a#123}
4567890

O Dash, por outro lado, visa principalmente ser compatível com POSIX (e não mais do que isso), fornecerá um erro de subestação incorreto se você tentar o seguinte:

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

Isso será importante se você usar /bin/sh(e, portanto dash) como intérprete para seus shellscripts e usar Bashisms neles. O Debian e o Ubuntu têm boas páginas wiki sobre Bashisms e por que eles são ruins em shellscripts em geral e init-scripts em particular. Portanto, você deve escolher conscientemente se precisa /bin/shou /bin/bashcomo intérprete para o seu script.

O Dash não deve ser usado como o shell padrão em seus sistemas. Basta usar o Bash para isso. Para portabilidade de seus scripts, você pode usar o Dash como intérprete para aumentar as chances de os scripts executarem em outros tipos de Linux e Unixes.

wzzrd
fonte
11
Se você escrever scripts com Bashisms, especifique /bin/bash; Muitos sistemas não-Linux possuem shshells reais, que nem sequer são compatíveis bash.
Chris S
echo ${a#123}não é um basismo, é parte da especificação de expansão do parâmetro POSIX. pubs.opengroup.org/onlinepubs/009695399/utilities/… Você não obtém os Bash mais avançados do estilo sed, os posix são do estilo substring + caracteres simples de expansão. O que significa, POSIX também permiteecho ${a#*6}
JM Becker
0

Como nem todas as conchas são definidas $SHELLquando executadas, você descobre seu shell atual com:

echo $0

Se der um erro, é csh, caso contrário, foi com o que argv[0]você foi chamado, que normalmente é o shell, talvez com um -hífen à esquerda , para indicar que é um shell de logon.

Isso não é garantido , pois argv[0]está sob o controle do processo de chamada, mas na prática é a abordagem mais confiável.

Phil P
fonte