| Bash | |
|---|---|
| Outros nomes | GNU Bash Bourne-Again Shell |
| Autor | Brian Fox |
| Desenvolvedor | Chet Ramey |
| Lançamento inicial | 1989 |
| Lançamento estável | 5.3
/ 3 de julho de 2025 |
| Repositório | |
| Escrito em | C |
| Sistema operacional | Unix-like e Windows |
| Antecessor | Bourne shell |
| Padrão | POSIX |
| Disponível em | 42 idiomas |
| Tipo | shell |
| Licença | GPLv3 |
| Website | www |
GNU Bash, ou simplesmente Bash, é um interpretador de comandos (shell) e uma linguagem de script desenvolvida para sistemas operacionais tipo Unix. Criado em 1989 por Brian Fox para o Projeto GNU, é uma alternativa livre e de código aberto ao Bourne shell.
Acrônimo para "Bourne-Again Shell", seu nome é um trocadilho com o sobrenome de Stephen Bourne, autor do seu antecessor retrocompatível. Semelhante a outros shells do Unix, o Bash pode executar instruções diretamente da linha de comandos ou de arquivos de texto conhecidos como shell scripts. Além de comandos internos, ele também permite interagir com outros executáveis presentes no sistema, sejam eles scripts ou arquivos binários, como as ferramentas coreutils.
Influenciado por outros projetos alternativos ao Bourne shell, como o Korn shell e o C shell, o Bash possui recursos de uma linguagem de programação de alto nível, como estruturas de controle, variáveis e funções, e novas funcionalidades, não só para programação, mas também para uso interativo, como histórico de comandos ilimitado, edição de linha de comandos e controle de trabalhos. Com suporte a 42 idiomas diferentes e às normas POSIX, ele é escrito na linguagem C e atualmente mantido por Chet Ramey junto à biblioteca Readline sob a terceira versão da GNU General Public License.
Apesar de ser desenvolvido para sistemas Unix-like, como Linux (no qual é o shell padrão em muitas distribuições), OpenBSD, NetBSD, FreeBSD, AIX, HP-UX, MINIX, Solaris e macOS, o Bash já foi portado para sistemas Windows pelo Cygwin, além de poder ser acessado pelo WSL.

Em 1987, pela Free Software Foundation, Brian Fox começou a desenvolver uma versão livre do Bourne shell para o Projeto GNU a pedido de Richard Stallman. Compatível com as normas POSIX, consistia no Bash e no Readline, que não era uma biblioteca separada do shell nos estágios iniciais do projeto. No dia 7 de junho de 1989, a versão 0.99 do Bash, ainda em fase beta, foi disponibilizada.
Nesse mesmo ano, Chet Ramey buscava alternativas ao Bourne shell com mais funções interativas para seus serviços de rede e servidores na Case Western Reserve University, como histórico de comandos, edição de linha de comandos e controle de trabalhos. Ao encontrar uma cópia de uma das primeiras versões do Bash, envolveu-se ativamente no desenvolvimento do software, implementando parte das funcionalidades que desejava e outras novidades, além de correções de falhas. Desde 1990, ano em que Brian saiu do projeto, Chet é o principal desenvolvedor do Bash. Para ele, o Bash é essencial para o funcionamento de vários sistemas do tipo Unix e carrega um legado importante para a infraestrutura de computadores.
O Bash foi um dos primeiros programas portados para o Linux por Linus Torvalds e é configurado como o shell padrão em várias distribuições. Ele também está incluso em coleções de pacotes do OpenBSD e do NetBSD, bem como no Ports do FreeBSD, além de ser distribuído para sistemas AIX, HP-UX, MINIX, Solaris e macOS, que inclui o programa nativamente no sistema. Já no Windows, o Bash pode ser adquirido através do Cygwin ou acessado pelo WSL.
Associado ao Projeto GNU, o Bash, escrito em C, é um software livre e de código aberto distribuído sob a GPLv3. Com suporte às normas POSIX, oferece compatibilidade reversa com o Bourne shell e apresenta funções únicas, ou incorporadas de outros projetos (C shell e Korn shell), que ampliam a interface padrão de um shell do Unix, como:
Além das funcionalidades interativas de um shell, ele implementa recursos comuns em linguagens de programação de alto nível, como estruturas de controle, variáveis e funções, e permite executar comandos de um arquivo de texto, podendo ser considerado uma linguagem de script. "Bash" é um acrônimo para "Bourne-Again Shell", um trocadilho com o sobrenome de Stephen Bourne, autor do Bourne shell, e a ideia de "renascimento por reimplementação".
Existem dois principais modos de execução do Bash: interativo e não interativo. No modo interativo, as instruções para o shell são fornecidas diretamente pela linha de comandos. Nela, os usuários podem acessar comandos executados anteriormente, executá-los novamente ou modificá-los, utilizando teclas de atalho do Emacs ou do vi, bem como autocompletar instruções e nomes de arquivos. Já no modo não interativo, os comandos são lidos de um shell script ou inseridos durante a invocação do executável do Bash como uma string associada ao parâmetro -c.
Outros modos de execução incluem: sessões de login e de não-login, modo POSIX, e modo restrito. A depender do tipo de sessão, o Bash pode ser customizado por alguns arquivos, como:
/etc/profile;~/.bash_profile;~/.bash_login;~/.profile;~/.bash_logout; e~/.bashrc.Em sessões de login, o arquivo /etc/profile, caso exista, é lido e seus comandos são executados pelo Bash. Após isso, ele procura pelos arquivos ~/.bash_profile, ~/.bash_login e ~/.profile, nessa ordem, e executa aquele que aparecer primeiro. Finalmente, com o término da sessão, ~/.bash_logout também é procurado e executado. Por sua vez, o arquivo ~/.bashrc é executado somente em sessões interativas que não sejam de login, mas ele é comumente inserido dentro do ~/.bash_profile como outra fonte de customizações para ser aplicado em qualquer tipo de sessão.
As instruções fornecidas ao Bash são fragmentadas em tokens, que podem ser interpretados como palavras ou operadores. As palavras são consideradas as unidades sintáticas dos comandos, enquanto os operadores controlam a execução e o fluxo de dados das instruções. Palavras reservadas são tipos especiais de palavras que, diferentes de uma palavra comum, recebem significados específicos pelo Bash. Operadores, palavras reservadas e outros termos (que se expandem, por exemplo), podem ser transformados em textos literais através de três mecanismos:
$, `, \ e !.Além disso, os códigos de escape ANSI podem ser utilizados na forma $'código', e sequências de caracteres iniciadas por uma cerquilha são ignoradas e consideradas comentários.
Comandos no Bash podem ser simples — formados por sequências de palavras separadas por espaços em branco, em que a primeira palavra determina o comando a ser executado e as demais especificam seus argumentos — ou compostos, que são formados por estruturas de controle ou encadeamentos, opcionalmente agrupados entre:
O Bash implementa alguns comandos internos, como cd, pwd e echo, e permite interagir com executáveis presentes no sistema, como scripts e arquivos binários. Shell scripts escritos em Bourne shell ou com sua própria sintaxe são suportados e podem ser executados diretamente pelo Bash como se fossem comandos.
Dois ou mais comandos ou encadeamentos podem ser combinados em uma estrutura sequencial com ;, que é equivalente a, e intercambiável com, uma quebra de linha. Outros operadores também combinam comandos em listas:
& envia o comando anterior para o segundo plano, executado de maneira assíncrona;&& implementa a conjunção lógica e executa o próximo comando somente se o anterior não falhar; e|| implementa a disjunção lógica e executa o próximo comando somente se o anterior falhar.Os dois últimos têm maior prioridade sobre os primeiros, que são os únicos capazes de finalizar instruções. Outras estruturas de controle estão disponíveis, incluindo três estruturas de repetição: while, until e for. Esse pode expandir palavras e, para cada expansão, executar um bloco de comandos, mas também possui outra forma, semelhante ao seu equivalente na linguagem C. Em qualquer uma das três, os comandos internos continue e break podem ser utilizados para controlar ciclos de repetições ou interrompê-las completamente.
Por outro lado, existem cinco estruturas de seleção: if, case, select, (( ... )) e [[ ... ]]. Estruturas select permitem gerar menus para o usuário selecionar uma entre várias opções. Já as duas últimas permitem avaliar expressões aritméticas e condicionais, que podem ser envolvidas por parênteses (que alteram a ordem de operações), precedidas pelo sinal de exclamação (que inverte o resultado lógico), ou combinadas com os operadores de conjunção e disjunção.
Funções permitem agrupar comandos para serem executados como se fossem apenas um, porém, diferente dos operadores de agrupamento, elas são executadas no mesmo ambiente do shell e possibilitam identificar cada grupo com um nome para invocá-los múltiplas vezes. No Bash, elas podem ser definidas através da palavra reservada function ou precedendo cada sequência de procedimentos por um nome, seguido de um par de parênteses.
Cada função possui um escopo próprio, contendo parâmetros e variáveis locais, que podem sobrescrever campos em escopos anteriores temporariamente. Aliás, funções podem ser recursivas e conter o comando interno return, que as interrompem e retorna um status de saída.
No Bash, parâmetros são entidades que armazenam valores, e variáveis são parâmetros identificados por um nome que têm zero ou mais atributos. A declaração de uma variável, determinada por uma expressão do tipo nome=valor, pode preceder qualquer comando, tornando-se visível apenas a ele, ou acompanhar estes comandos internos:
alias, permitindo que seu conteúdo possa ser interpretado diretamente como um comando;declare e typeset, que configuram seus atributos e fornecem outra interface para declará-la;export, que a exporta como uma variável de ambiente;readonly, que a configura somente para leitura, impedindo que seja removida ou alterada; elocal, que a declara localmente dentro de uma função.Definições de variáveis podem ser revertidas somente pelo comando unset, enquanto aliases podem ser removidos usando unalias. Qualquer valor atribuído a uma variável é tratado como uma cadeia de caracteres, mas esse comportamento pode ser alterado por atributos que permitem interpretar valores como números inteiros, expandindo expressões aritméticas para atribuições automaticamente, ou como arranjos, que podem ser:
Além de variáveis, existem parâmetros posicionais e especiais. Aos posicionais, são atribuídos os argumentos fornecidos pela linha de comandos ou às funções, e, ao invés de nomes, eles são identificados por números, que correspondem à posição de cada argumento. Fora esses, outros parâmetros recebem tratamentos especiais pelo Bash:
* e @ expandem para os parâmetros posicionais, de maneiras diferentes;# expande para a quantidade de parâmetros posicionais;? expande para o status de saída do último comando;- expande para o conjunto de opções e flags do shell;$ expande para o identificador de processo do shell;! expande para o identificador do último processo colocado em segundo plano; e0 expande para o nome do shell ou do script.Entre aspas duplas, * expande para uma só palavra contendo os parâmetros posicionais separados pelo primeiro caractere armazenado na variável IFS, mas, fora delas, expande cada parâmetro para uma palavra separada, sujeita a expansões de nome de arquivo e também de divisão de palavras. Sob esse último tipo expansão, @ expande os parâmetro para palavras separadas, mas, sem essa divisão (em atribuições de valores a variáveis, por exemplo), expande para uma única palavra com os parâmetros separados por sinais de espaço. Fora de aspas duplas, as palavras expandidas por @ também são suscetíveis a expansões divisivas.
Expansões são mecanismos que permitem transformar tokens em outros elementos, como listas de arquivos, comandos e argumentos, além de substituir expressões por resultados de operações aritméticas ou valores armazenados em variáveis, por exemplo. As seguintes expansões são suportadas pelo Bash:
$ echo a{d,c,b}e
ade ace abe
$ echo ~/downloads/
/home/usuário/downloads/
$ var=123 && echo "${var}" ${var} "$var" $var
123 123 123 123
$ echo Permissões: "$(stat -c %a script)" ou $(stat -c %A script)
Permissões: 755 ou -rwxr-xr-x
$ echo "$((1 - 2 + 3))" = $((4 * 1 / 2))
2 = 2
$ tac <(printf 'Imprime\nArquivo\nInverso\n')
Inverso
Arquivo
Imprime
$ var='Abc 123' && cat script
echo "Quantidade de argumentos: ${#}. 1: ${1}. 2: ${2}. 3: ${3}."
$ bash script "$var" $var
Quantidade de argumentos: 3. 1: Abc 123. 2: Abc. 3: 123.
*, ? e [...], para nomes de arquivos.$ ls
notas.odt notas.txt notas.txt.bak
$ ls notas.txt*
notas.txt notas.txt.bak
Após tudo isso, aspas e barras inversas fora de expansões e aspas simples são removidas.
Antes de executar um comando, o Bash permite redirecionar seus fluxos padrão para outros arquivos, além de duplicar, abrir, fechar e mover descritores. Redirecionamentos no Bash são implementados por vários operadores, que são lidos em ordem, da esquerda para a direita, e podem aparecer antes, dentro e depois de cada comando:
< e > redirecionam entrada e saída;>> anexa uma saída a um arquivo;<< e <<< criam here documents e here strings;<& e >& duplicam e movem descritores de arquivo; e<> abre um descritor para leitura e escrita.Todos esses operadores podem ser prefixados pelos números 0, 1 e 2, relacionados ao descritores padrão de entrada, de saída e de erro, nessa ordem. O caractere &, que faz referência a ambos os fluxos 1 e 2 simultaneamente, também pode ser usado com alguns desses operadores, ou substituído por uma duplicação do tipo 2>&1.
A internacionalização e tradução do Bash para outros idiomas diferentes do inglês é feita pelo Translation Project, que traduz o software para 41 idiomas diferentes, incluindo o português europeu e o português brasileiro. Apesar de utilizar apenas oito bits para indexar caracteres, o suporte do Readline a codificações multi-byte permite abranger alfabetos mais complexos no Bash, que se adapta ao locale e interpreta strings em sequências complexas automaticamente.
Como uma alternativa ao Bourne shell (sh), o Bash implementa algumas funcionalidades extras. Por exemplo:
!;command;read, umask e test;Tanto o Bash quanto o Korn shell (ksh) atendem às normas POSIX e são compatíveis com scripts sh. Algumas novidades adicionadas ao Bash são derivadas do ksh, o que garante algumas funcionalidades comuns para ambos, como:
$(...) e de expressões aritméticas com $((...));getopts e let;bg, fg, jobs, kill e wait;select;export e readonly; eecho 'Olá, mundo!'
function fibo {
# A opção `-i` associa o atributo inteiro às variáveis. Assim, cada
# atribuição será validada como uma expressão aritmética.
declare -i a=0 b=1 c
for (( c="$1"; c > 1; c-- )); do
echo -n "$a, "
b="b + a"
a="b - a"
done
(( c > 0 )) && echo "$a."
}
# Exibe "0, 1, 1, 2, 3, 5, 8, 13, 21, 34."
fibo 10