Bash vs. Dash: Qual usar para Shell Script? Comparação e Guia de Escolha
Ao operar ou desenvolver sites, muitas vezes sentimos a necessidade de automatizar pequenas tarefas rotineiras, não é mesmo? É nessas horas que o "shell script" se torna um grande aliado. No entanto, ao começar a escrever um, você já se deparou com aquela inscrição quase mágica na primeira linha, como #!/bin/bash ou #!/bin/sh, e se perguntou: "qual é a diferença?"
Na verdade, essa diferença é extremamente importante. É um conhecimento essencial, especialmente para evitar a tragédia de "funcionou perfeitamente no meu computador, mas deu erro no servidor!". Neste artigo, vamos desvendar as diferenças entre dois shells muito utilizados, Bash e Dash, de forma clara para iniciantes, com exemplos de código que você pode copiar e colar para testar. Ao final da leitura, você será capaz de escrever scripts de shell robustos e que funcionam em qualquer ambiente!
Afinal, o que são Bash e Dash?
Primeiro, vamos apresentar nossos dois protagonistas (os dois shells). Conhecer seus pontos fortes e suas "personalidades" é o primeiro passo para se dar bem com eles.
Bash (Bourne-Again SHell) - O Parceiro de Todos, o Shell Cheio de Recursos
O Bash é adotado como o "shell de login" padrão na maioria dos sistemas Linux e em versões mais antigas do macOS. É ele que inicia quando abrimos um terminal. Muitas das funcionalidades convenientes que usamos no dia a dia sem nem perceber — como navegar pelo histórico de comandos com as setas, autocompletar comandos e nomes de arquivo com a tecla Tab, ou usar exibições coloridas — são fornecidas pelo Bash. Pode-se dizer que é um shell amigável, de alta funcionalidade e extremamente adequado para a operação direta por humanos (uso interativo).
Dash (Debian Almquist SHell) - O Herói dos Bastidores, o Shell Rápido e Leve
Por outro lado, a principal característica do Dash é ser extremamente leve e rápido. Como suas funcionalidades extras foram removidas, ele é especializado em executar scripts de forma ágil. Por isso, especialmente em sistemas operacionais baseados em Debian, como o Ubuntu, ele é usado para os scripts de inicialização do sistema e como o shell padrão quando se especifica #!/bin/sh. Ou seja, mesmo que tenhamos poucas oportunidades de interagir diretamente com ele, o Dash está trabalhando a todo vapor nos bastidores do sistema.
O Grande Divisor de Águas: Conformidade POSIX como "Dialeto" vs. "Língua Padrão"
A maior diferença entre o Bash e o Dash está no quão fiel cada um é a um padrão chamado POSIX.
Pode ser que esse termo técnico tenha te deixado um pouco confuso. De forma simples, o POSIX é como a "língua padrão do mundo dos shell scripts". Um script escrito nessa língua padrão tem a garantia de que funcionará da mesma forma em qualquer ambiente (sistema operacional).
- Dash: É muito fiel à "língua padrão" POSIX. Ele praticamente не fala "dialetos".
- Bash: Também fala a "língua padrão", mas conhece muitos "dialetos" convenientes (extensões próprias do Bash).
As funcionalidades práticas que usamos no terminal no dia a dia são, na maioria das vezes, "dialetos" do Bash. E em muitos sistemas, /bin/sh aponta para um shell que só entende a "língua padrão" (como o Dash). Esta é a principal causa do fenômeno "funciona no meu PC (Bash), mas não no servidor (/bin/sh)".
Escrever #!/bin/bash na primeira linha do seu script é como declarar: "Este script usará os dialetos do Bash!", o que permite usar suas funcionalidades convenientes. Por outro lado, escrever #!/bin/sh é como pedir: "Use a língua padrão, por favor!". Se você quer aumentar a portabilidade e a compatibilidade, a regra geral é usar #!/bin/sh e se conscientizar para escrever de maneira compatível com o POSIX.
【Na Prática】Comparando com Código: Como a Sintaxe do Bash e do Dash se Diferem?
A partir de agora, vamos comparar a sintaxe do "dialeto" do Bash com a da "língua padrão" compatível com POSIX, que também funciona no Dash, através de exemplos de código concretos. Para vivenciar a experiência de "funcionar", sinta-se à vontade para copiar e executar no seu terminal!
1. Manipulação de arrays
Arrays são usados quando queremos lidar com múltiplos valores de uma só vez. No Bash, a escrita é intuitiva, mas o padrão POSIX не tem uma especificação para arrays. Por isso, para fazer o mesmo no Dash, é preciso um pouco de criatividade.
A forma do Bash (dialeto)
Você pode definir um array facilmente usando () e acessar seus elementos especificando um índice, como em ${meu_array[1]}.
#!/bin/bash
# Define um array
frutas=("maca" "banana" "cereja")
# Exibe o segundo elemento (índice começa em 0)
echo ${frutas[1]}
Resultado:
banana
A forma compatível com o Dash (língua padrão)
Ao escrever de forma compatível com POSIX, em vez de arrays, usamos strings separadas por espaços ou os parâmetros posicionais do shell ($1, $2...). Aqui, apresentamos o método que usa um laço for. A prática comum é definir os valores e processá-los em sequência com um laço for.
#!/bin/sh
# Define como uma string separada por espaços
frutas="maca banana cereja"
# Usa um laço for para exibir todos os elementos em ordem
for fruta in $frutas; do
echo "Eu gosto de $fruta!"
done
Resultado:
Eu gosto de maca!
Eu gosto de banana!
Eu gosto de cereja!
2. Sintaxe de condicionais
A estrutura condicional "se acontecer X, faça Y" é fundamental em scripts. E aqui também há uma grande diferença.
A forma do Bash (dialeto)
No Bash, pode-se usar um comando de teste mais avançado, o [[ ... ]]. Ele é muito prático por permitir conectar múltiplas condições com &&, fazer comparações de strings com == e até correspondência de padrões.
#!/bin/bash
nome="Taro"
idade=25
# Conecta as duas condições com &&
if [[ "$nome" == "Taro" && "$idade" -gt 20 ]]; then
echo "Bem-vindo, Taro!"
fi
Resultado:
Bem-vindo, Taro!
A forma compatível com o Dash (língua padrão)
O comando de teste compatível com POSIX é o [ ... ]. Este é um comando mais antigo e com algumas restrições. Por exemplo, a comparação de strings é feita com um único =, e para múltiplas condições deve-se usar -a (AND), -o (OR) ou combinar múltiplos [ ]. Por segurança, o mais recomendado é combinar múltiplos [ ].
#!/bin/sh
nome="Taro"
idade=25
# Descreve a condição usando dois [ ]
if [ "$nome" = "Taro" ] && [ "$idade" -gt 20 ]; then
echo "Bem-vindo, Taro!"
fi
Resultado (o mesmo):
Bem-vindo, Taro!
3. Substituição de strings
Querer substituir um caractere específico dentro de uma variável por outro também é um caso de uso muito comum.
A forma do Bash (dialeto)
No Bash, você pode substituir strings facilmente com a sintaxe ${variavel/antigo/novo}.
#!/bin/bash
nome_arquivo="foto_2025.jpg"
# Substitui "jpg" por "png"
novo_nome_arquivo=${nome_arquivo/jpg/png}
echo $novo_nome_arquivo
Resultado:
foto_2025.png
A forma compatível com o Dash (língua padrão)
Ao escrever de forma compatível com POSIX, o mais comum é combinar comandos externos como sed ou awk para manipulação de strings. Aqui, mostramos um exemplo usando o sed. Fica um pouco mais longo, mas dá a tranquilidade de saber que funcionará com certeza em qualquer ambiente.
#!/bin/sh
nome_arquivo="foto_2025.jpg"
# Passa o conteúdo da variável para o comando sed com echo para fazer a substituição
novo_nome_arquivo=$(echo "$nome_arquivo" | sed 's/jpg/png/')
echo "$novo_nome_arquivo"
Resultado (o mesmo):
foto_2025.png
Conclusão: Afinal, qual deles devo usar?
Já vimos as diferenças, mas o que você mais quer saber é: "então, qual deles eu uso?". A resposta é "depende da situação", mas existe uma diretriz recomendada para iniciantes.
Escolha recomendada por caso de uso
-
Para tarefas rápidas no terminal 👉 Use o Bash sem pensar duas vezes!
No seu shell do dia a dia, aproveite ao máximo as funcionalidades convenientes como autocompletar e histórico. Não há necessidade de usar uma sintaxe mais complicada. -
Para scripts que rodarão em um servidor ou serão distribuídos para outros 👉 Pense seriamente no Dash (compatível com POSIX)!
Se o script precisa funcionar além do seu próprio ambiente, a compatibilidade é o fator mais importante. Use#!/bin/she se esforce para escrever na "língua padrão" do POSIX. Isso aumenta drasticamente a probabilidade de seu script continuar funcionando em Linux, BSD e até em novos sistemas que venham a surgir.
Conselho para iniciantes
Se você está apenas começando a aprender shell script, recomendamos que desde o início aprenda a escrever de forma compatível com POSIX, usando `#!/bin/sh`. Por quê? Porque o mais abrangente engloba o menos. Um script compatível com POSIX funcionará sem problemas no Bash, mas o contrário não é verdadeiro. Se você dominar a "língua padrão" desde o início, não terá problemas, não importa o ambiente em que esteja.
Cuidado! 'Dialetos' do Bash (Bashisms) que você pode usar sem querer
É muito comum escrever um código achando que está tudo certo, mas na verdade ele era um "dialeto" do Bash. Aqui, apresentamos alguns dos "Bashisms" mais comuns.
[[ ... ]]: Já mencionado antes, mas é o Bashism mais representativo. Acostume-se a escrever suas condicionais com[ ... ].function minha_func { ... }: A palavra-chavefunctionpara definir funções é do Bash. A forma compatível com POSIX éminha_func() { ... }.echo -e "...": A opção-e, que interpreta sequências de escape como\n(nova linha), não se comporta da mesma forma em todos os shells. Usar o comandoprintfem seu lugar é muito mais seguro e confiável.source ./meu_script.sh: O comandosourcepara carregar outro script também é um Bashism. A versão compatível com POSIX é. ./meu_script.sh(um ponto seguido de um espaço).
Apenas evitando estes Bashisms, a compatibilidade dos seus scripts melhorará drasticamente.
Resumo: Domine a conveniência do Bash e a robustez do Dash!
Neste artigo, explicamos como escrever scripts de shell altamente compatíveis através das diferenças entre o Bash e o Dash.
- Para o uso diário no terminal, use o Bash, que é cheio de funcionalidades convenientes.
- Ao escrever scripts, tenha em mente o Dash (compatível com POSIX) para que eles funcionem em qualquer ambiente.
- Na dúvida, a melhor prática é escrever
#!/bin/shna primeira linha do seu script e praticar a escrita na "língua padrão" do POSIX.
Ao adquirir essa mentalidade, você pode evitar problemas de "não funciona por causa do ambiente" e escrever scripts que serão úteis em uma variedade muito maior de situações. Que tal começar hoje mesmo a almejar "scripts que funcionam em qualquer lugar"?