🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

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).

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

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.

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.

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"?


Confira também este artigo

Exemplos de Scripts em Dash (if, laços, funções simples)