O que é o Dash, o shell padrão do Ubuntu? Um guia completo de uso e diferenças com o Bash
Se você usa o Ubuntu, talvez já tenha ouvido falar do Dash (dash). A existência do Dash é especialmente importante ao escrever scripts de shell. Embora o shell que a maioria dos usuários usa diariamente seja o Bash, nos bastidores do sistema Ubuntu, o Dash está em pleno funcionamento. Neste artigo, vamos explicar de forma clara para iniciantes o papel do Dash como o shell padrão do Ubuntu, seu uso básico e as diferenças com o Bash que costumam confundir muitas pessoas.
Como criador de conteúdo para a web, você encontrará cada vez mais scripts de shell em tarefas de configuração de servidor e implantação. Todo o código deste artigo foi feito para funcionar com um simples copiar e colar, então, sinta-se à vontade para experimentar e sentir a alegria de ver algo "funcionar"!
Afinal, o que é o Dash? E por que o Ubuntu o utiliza?
O Dash (Debian Almquist shell) é um shell de linha de comando usado em sistemas operacionais do tipo UNIX. Sua principal característica é ser leve e rápido. Em comparação com o Bash, um shell rico em recursos, o Dash se concentra em funções básicas, o que torna a execução de scripts muito mais rápida.
O Ubuntu (e sua base, o Debian) aproveita essa velocidade ao adotar o Dash como o shell de sistema padrão (/bin/sh) para executar scripts de inicialização do sistema e vários processos em segundo plano. Isso significa que, além do shell de login interativo (/bin/bash) que normalmente usamos no terminal, o Dash está realizando tarefas de forma eficiente dentro do sistema. Essa divisão de trabalho — "Dash para o shell do sistema, Bash para o shell de login" — é o que sustenta o desempenho ágil do Ubuntu.
Vamos verificar ao que o /bin/sh está vinculado no seu próprio ambiente. Executar o comando a seguir mostrará sua verdadeira identidade.
ls -l /bin/sh
Na maioria dos casos, você verá /bin/sh -> dash, indicando que a entidade real de /bin/sh é o Dash.
Uso básico do Dash
Agora, vamos executar um script simples usando o Dash. O uso do Dash é muito simples.
1. Criar um arquivo de script
Primeiro, crie um arquivo de script simples com um editor de texto. Vamos chamá-lo de hello_dash.sh.
nano hello_dash.sh
Assim que o editor abrir, cole o conteúdo a seguir e salve.
#!/bin/sh
# A linha acima é chamada de "shebang" e especifica que este script deve ser executado com /bin/sh (ou seja, o Dash).
echo "Hello, Dash!"
2. Conceder permissão de execução
Dê ao arquivo de script que você criou a permissão necessária para ser executado.
chmod +x hello_dash.sh
3. Executar o script
Agora que está tudo pronto, vamos executar o script.
./hello_dash.sh
Se "Hello, Dash!" aparecer no terminal, deu certo! Esta é a maneira mais básica de executar um script Dash. Ao especificar #!/bin/sh no shebang, o script foi interpretado e executado pelo Dash.
Exemplo avançado: Usando variáveis e laços no Dash
Para um exemplo mais prático, vamos ver um script que usa variáveis e um laço while. A sintaxe básica é semelhante à do Bash, mas é importante ter em mente a escrita em conformidade com o padrão POSIX, que garante o funcionamento no Dash.
O script a seguir executa um laço até que um contador chegue a 3, exibindo a contagem atual.
#!/bin/sh
# Definir uma variável
COUNT=1
# Continuar o laço enquanto COUNT for menor ou igual a 3
while [ "$COUNT" -le 3 ]; do
echo "Contagem atual: $COUNT"
# Adicionar 1 a COUNT. Usar o comando expr é a forma mais segura.
COUNT=$(expr "$COUNT" + 1)
done
echo "Laço finalizado."
Salve este script com um nome como loop_test.sh, conceda permissão de execução da mesma forma e execute-o com ./loop_test.sh. Você deverá ver a contagem de 1 a 3.
[ "$COUNT" -le 3 ]: Isto é um teste condicional.-lesignifica "menor ou igual a" (less than or equal to). Como o[[ ... ]], comum no Bash, não pode ser usado no Dash, devemos usar o[ ... ].COUNT=$(expr "$COUNT" + 1): Isto é para aritmética de variáveis. Embora o Bash permita uma sintaxe mais simples como((COUNT++)), usar o comandoexpré o método mais seguro e compatível no Dash.
Pontos de atenção: Incompatibilidades entre Dash e Bash
O obstáculo mais comum para iniciantes ao escrever scripts de shell é a diferença de funcionalidades entre o Dash e o Bash. É comum que um comando que funciona perfeitamente no terminal usual (Bash) cause um erro em um script que especifica /bin/sh (Dash).
No ambiente de desenvolvimento web, quando scripts são executados como tarefas cron em um servidor ou por meio de ferramentas de implantação, eles são frequentemente executados pelo shell padrão do sistema, que é o Dash. Portanto, usar inconscientemente recursos exclusivos do Bash (conhecidos como "Bashisms") pode causar erros que só aparecem no ambiente de produção.
Abaixo estão alguns dos exemplos mais representativos de incompatibilidade aos quais você deve prestar atenção especial.
1. Não é possível usar arrays
No Bash, você pode manipular arrays facilmente com algo como fruits=("Apple" "Banana" "Cherry"), mas o Dash não suporta arrays.
Exemplo que funciona apenas no Bash (erro no Dash):
#!/bin/bash
# Note que o shebang é /bin/bash
fruits=("Apple" "Banana" "Cherry")
echo "A primeira fruta é ${fruits[0]}."
2. Não é possível usar a Expansão de Chaves (Brace Expansion) {..}
No Bash, se você escrever echo file{1..3}.txt, ele se expande para file1.txt file2.txt file3.txt, mas o Dash не tem essa funcionalidade.
Exemplo que funciona apenas no Bash (exibido como está no Dash):
#!/bin/bash
# Este comando gera três nomes de arquivo no Bash
touch data_{a,b,c}.csv
Para fazer o mesmo no Dash, você precisaria usar um laço for ou algo semelhante.
3. Não é possível usar o comando de teste `[[ ... ]]`
Como mencionado anteriormente, o comando de teste estendido do Bash, [[ ... ]], embora mais poderoso, não pode ser usado no Dash. Você deve se ater ao compatível com POSIX, [ ... ].
Exemplo que funciona apenas no Bash (erro no Dash):
#!/bin/bash
NAME="hoge"
# [[ ... ]] pode usar && e || internamente
if [[ "$NAME" == "hoge" && -n "$NAME" ]]; then
echo "O nome é hoge."
fi
Código alternativo que também funciona no Dash:
#!/bin/sh
NAME="hoge"
# Em [ ... ] usa-se -a (AND)
if [ "$NAME" = "hoge" -a -n "$NAME" ]; then
echo "O nome é hoge."
fi
Note também que a comparação de strings usa = em vez de ==.
Conclusão: Escreva scripts robustos com o Dash em mente
Neste artigo, explicamos o papel do Dash como o shell padrão do Ubuntu, seu uso básico e suas diferenças com o Bash.
- O Dash é leve e rápido, por isso é usado como o shell do sistema do Ubuntu (
/bin/sh). - O shell de login que usamos normalmente é o Bash, e existem diferenças funcionais.
- Ao escrever scripts de shell, usar
#!/bin/she ater-se a uma sintaxe compatível com POSIX que funcione no Dash resultará em scripts robustos e independentes do ambiente. - Tenha cuidado para não usar recursos específicos do Bash (Bashisms), como arrays, expansão de chaves e
[[ ... ]], em scripts/bin/sh.
Pode ser confuso no início, mas entender essas diferenças pode evitar problemas do tipo "funcionou na minha máquina, mas não no servidor". Familiarize-se com o mundo do Ubuntu dash e aspire a criar scripts de shell mais confiáveis!
Artigos relacionados
Se você quiser aprender mais sobre escrita avançada de scripts e compatibilidade com o Bash, este artigo também é recomendado.