Bash
| Bash | |
|---|---|
| Outros nomes | GNU Bash Bourne-Again Shell |
| Autor | Brian Fox |
| Desenvolvedor | Chet Ramey |
| Lançamento inicial | 1989 |
| Lançamento estável | 5.3[1]
/ 3 julho 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.[nota 1]
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.[3][4][5][6][7]
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.[3][4][5][6][8]
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.[5][6][9]
História
[editar | editar código]
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.[6][7] No dia 7 de junho de 1989, a versão 0.99 do Bash, ainda em fase beta, foi disponibilizada.[2]
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.[7] Desde 1990, ano em que Brian saiu do projeto, Chet é o principal desenvolvedor do Bash.[3][7] 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.[7]
O Bash foi um dos primeiros programas portados para o Linux por Linus Torvalds[7][10] 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.[5][6][9]
Características
[editar | editar código]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:
- edição de linha de comandos;
- histórico de comandos ilimitado;
- controle de trabalhos;
- arranjos de tamanho ilimitado; e
- aritmética de números inteiros em qualquer base de 2 a 64.
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".[3][4][5][6]
Execução e inicialização
[editar | editar código]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.[4][5][6] 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.[4][6]
Sintaxe
[editar | editar código]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:
- prefixando caracteres com uma barra inversa, o caractere de escape do Bash;
- envolvendo os termos com aspas simples, que preservam os valores literais de quaisquer caracteres; e
- envolvendo os termos com aspas duplas, que mantêm os significados dos caracteres
$,`,\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.[4][6]
Comandos
[editar | editar código]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:
- parênteses, que criam um subshell, um novo ambiente dentro do próprio shell; ou
- chaves, que não criam um subshell, executando as intruções no mesmo ambiente de invocação.
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.[4][6]
Estruturas de controle
[editar | editar código]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.[4][6]
Funções
[editar | editar código]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.[4][5][6]
Parâmetros
[editar | editar código]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;declareetypeset, 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.[4][5][6]
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:
- indexados, cujos índices são números; ou
- associativos, cujos campos são identificados por strings arbitrárias.
Além de variáveis, existem parâmetros posicionais e especiais. Aos posicionais, são atribuídos os argumentos fornecidos pela linha de comando 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; e0expande para o nome do shell ou do script.[4][6]
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.[4]
Expansões
[editar | editar código]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:
- expansão de chaves, que gera múltiplas sequências de caracteres com prefixos e sufixos em comum;
$ echo a{d,c,b}e
ade ace abe
- expansão do til, substituído por um diretório de usuário;
$ echo ~/downloads/
/home/usuário/downloads/
- expansão de parâmetro, que expande e manipula valores de parâmetros;
$ var=123 && echo "${var}" ${var} "$var" $var
123 123 123 123
- substituição de comando, que substitui instruções pelas suas próprias saídas sem quebras de linha finais;
$ echo Permissões: "$(stat -c %a ./script)" ou $(stat -c %A ./script)
Permissões: 755 ou -rwxr-xr-x
- expressões aritméticas, que são validadas e substituídas pelos seus resultados;
$ echo "$((1 - 2 + 3))" = $((4 * 1 / 2))
2 = 2
- substituição de processos, que substitui saídas e entradas de comandos por referências a arquivos;
$ tac <(printf 'Imprime\nArquivo\nInverso\n')
Inverso
Arquivo
Imprime
- divisão de palavras, que separa o resultado de uma expansão em múltiplas palavras, desde que ela não esteja entre aspas;
$ var='Abc 123' && cat script
echo "Quantidade de argumentos: ${#}; 1: ${1}; 2: ${2}; 3: ${3}."
$ bash script "$var" $var
Quantidade de argumentos: 1; 1: Abc 123; 2: Abc; 3: 123.
- expansão de nome de arquivo, que expande padrões (globs), como
*,?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.[4][5][6]
Redirecionamentos
[editar | editar código]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.[4][5][6] 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.[4][6]
Localização
[editar | editar código]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.[3][8] 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.[5][6]
Comparação com outros shells
[editar | editar código]Bourne shell
[editar | editar código]Como uma alternativa ao Bourne shell (sh), o Bash implementa algumas funcionalidades extras. Por exemplo:
- a palavra reservada
!; - o comando interno
command; - atualizações para os comandos internos
read,umasketest; - expansão de chaves (herança do C shell);
- possibilidade de definir variáveis e funções com o mesmo nome;
- possibilidade de desativação ou reescrita de comandos internos;
- autocompletamento de comandos e nomes de arquivos;
- customização dos prompts e da linha de comandos; e
- correções de vulnerabilidades.[6]
Korn shell
[editar | editar código]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:
- novas variáveis de ambiente que controlam o shell;
- expansão de comandos com
$(...)e de expressões aritméticas com$((...)); - novos comandos internos, como
getoptselet; - expansão do til para diretórios de usuário (herança do C shell);
- controle de trabalhos com
bg,fg,jobs,killewait; - histórico e edição de linha de comandos com atalhos nos estilos Emacs e vi;
- aliases e a estrutura de seleção
select; - extensões para os comandos
exportereadonly; e - variáveis locais restritas ao escopo de uma função.[6]
Exemplos
[editar | editar código]Olá, mundo!
[editar | editar código]echo 'Olá, mundo!'
Sequência de Fibonacci
[editar | editar código]function fibo {
local t=0 a=0 b=1 c="$1"
while ((c > 1)); do
echo -n "$a, "
t="$a"
a="$b"
b="$((t + b))"
c="$((c - 1))"
done
((c > 0)) && echo "$a."
}
# Exibe "0, 1, 1, 2, 3, 5, 8, 13, 21, 34."
fibo 10
Notas
Referências
- ↑
- Larabel, Michael (4 de julho de 2025). «Bash 5.3 Released With Many Improvements» [Bash 5.3 Lançado Com Muitas Melhorias]. Phoronix (em inglês). Consultado em 18 de julho de 2026. Cópia arquivada em 6 de julho de 2026
- Ramey, Chet (5 de julho de 2025). «Bash-5.3-release available». bug-bash (Lista de grupo de correio) (em inglês). Consultado em 18 de julho de 2026. Cópia arquivada em 15 de julho de 2026
- 1 2 Fox, Brian; Tower Jr., Leonard H. (7 de junho de 1989). «Bash is in beta release!» [O Bash está em versão beta!] (em inglês). Grupo de notícias: gnu.announce. Consultado em 18 de julho de 2026. Cópia arquivada em 10 de fevereiro de 2026
- 1 2 3 4 5 «GNU Bash». Projeto GNU (em inglês). 22 de setembro de 2020. Consultado em 18 de julho de 2026. Cópia arquivada em 17 de julho de 2026
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- «Bash Reference Manual» [Manual de Referência do Bash]. Projeto GNU (em inglês). 18 de maio de 2025. Consultado em 18 de julho de 2026. Cópia arquivada em 18 de julho de 2026
- «Bash Reference Manual» [Manual de Referência do Bash]. Case Western Reserve University (em inglês). 18 de maio de 2025. Consultado em 18 de julho de 2026. Cópia arquivada em 17 de junho de 2026
- 1 2 3 4 5 6 7 8 9 10 11
- Ramey, Chet (24 de fevereiro de 2026). «The GNU Bourne-Again SHell». Case Western Reserve University (em inglês). Consultado em 18 de julho de 2026. Cópia arquivada em 17 de junho de 2026
- «BASH - The Bourne-Again Shell». Case Western Reserve University (em inglês). Consultado em 18 de julho de 2026. Cópia arquivada em 17 de fevereiro de 2026
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
- Ramey, Chet. «Bash, the Bourne−Again Shell» (PDF). Case Western Reserve University (em inglês). Consultado em 18 de julho de 2026. Cópia arquivada (PDF) em 21 de fevereiro de 2026
- Ramey, Chet. «Bash − The GNU shell» (PDF). Case Western Reserve University (em inglês). Consultado em 18 de julho de 2026. Cópia arquivada (PDF) em 3 de maio de 2026
- Ramey, Chet (19 de maio de 2011). «The Bourne-Again Shell». In: Brown, Amy; Wilson, Greg. The Architecture Of Open Source Applications [A Arquitetura Dos Aplicativos De Código Aberto] (em inglês). 1. [S.l.]: Lulu Press, Inc. ISBN 978-1-257-63801-7. Cópia arquivada em 11 de julho de 2026
- 1 2 3 4 5 6 «The A-Z of Programming Languages: BASH/Bourne-Again Shell» [O Guia Completo das Linguagens de Programação: BASH/Bourne-Again Shell]. Computerworld (em inglês). Consultado em 18 de julho de 2026. Arquivado do original em 11 de agosto de 2016
- 1 2 «The bash textual domain» [O domínio textual do Bash]. Translation Project (em inglês). 1 de março de 2026. Consultado em 18 de julho de 2026. Cópia arquivada em 5 de maio de 2026
- 1 2 «O que é o Subsistema do Windows para Linux?». Microsoft Learn. 21 de maio de 2025. Consultado em 18 de julho de 2026. Cópia arquivada em 13 de maio de 2026
- ↑ Verma, Adarsh (25 de agosto de 2019). «Linus Torvalds's Famous Email — The First Linux Announcement» [O Famoso E-mail De Linus Torvalds — O Primeiro Anúncio Do Linux]. Fossbytes (em inglês). Consultado em 18 de julho de 2026. Cópia arquivada em 22 de abril de 2026
Ligações externas
[editar | editar código]- «GNU Bash» (em inglês). Página oficial com descrição geral, downloads e documentações