Bash
| Bash | |
|---|---|
| Outros nomes | GNU Bash Bourne-Again Shell |
| Autor | Brian Fox |
| Desenvolvedor | Chet Ramey (Projeto GNU) |
| Lançamento inicial | 8 de junho de 1989 |
| Lançamento estável | 5.3[1]
/ 30 de julho de 2025 |
| Repositório | |
| Escrito em | C |
| Sistema operacional | Unix-like e Windows |
| Tipo | shell |
| Licença | GPL |
| Website | www |
GNU Bash ou simplesmente Bash é um interpretador de comandos do Projeto GNU desenvolvido para sistemas operacionais tipo Unix.
Acrônimo para "Bourne-Again SHell", seu nome consiste em um trocadilho com seu antecessor, Bourne shell, com o qual é retrocompatível, garantindo que a maioria de seus scripts possam ser executados pelo Bash sem modificação. Semelhante a outros shells Bourne, o Bash permite a execução de instruções diretamente pela linha de comando ou através de arquivos de texto conhecidos como shell scripts. Além de comandos internos, o usuário também pode interagir com arquivos binários presentes no sistema, como as ferramentas coreutils.[2][3][4]
Lançado em 8 de junho de 1989,[5] o Bash apresenta recursos e características de uma linguagem de programação de alto nível: estruturas de controle (comandos compostos), variáveis e funções são alguns exemplos.[3][4] Além disso, oferece melhorias em relação ao Bourne shell, tanto para programação quanto para uso interativo, como controle de trabalhos, edição de linha de comando e histórico de comandos ilimitado. É compatível com as normas POSIX, característica herdada de seu antecessor, de forma que scripts Bash possam ser executados em diversos sistemas Unix-like.[2][3][4]
Apesar de ser desenvolvido para sistemas desse tipo, tais como Linux (no qual é o shell padrão em muitas distribuições), FreeBSD, OpenBSD, NetBSD, Solaris e macOS, o Bash já foi portado para sistemas Windows, pelo Cygwin e pelo WSL.[6][7]
História
[editar | editar código]Em 1987, pela Free Software Foundation, Brian Fox começou a desenvolver um clone do Bourne shell, a pedido de Richard Stallman, utilizando a linguagem de programação C, de forma que atendesse ao padrão POSIX e que fosse parte do Projeto GNU sob a licença GPL. Essa versão alternativa, livre e de código aberto consistia no Bash e na biblioteca Readline, que nos primeiros estágios de desenvolvimento ainda não era separada do shell.
Em 1989, enquanto trabalhava para a Case Western Reserve University, Chet Ramey, insatisfeito com os shells disponíveis no momento, buscou alternativas que fornecessem funcionalidades mais interativas, como controle de trabalhos, edição de linha de comando e histórico de comandos. Após encontrar uma cópia de uma das primeiras versões do Bash, Chet implementou parte das funcionalidades que desejava e algumas correções de falhas presentes no software. Ao enviar os patches para Brian, Chet gradualmente tornou-se um co-mantenedor do programa até assumir a liderança do projeto em 1990, quando Brian parou de contribuir para o seu desenvolvimento.[8]
Chet Ramey ainda é o principal desenvolvedor do Bash e, segundo ele, suas contribuições compõem a grande maioria das novidades adicionadas ao software em anos de desenvolvimento.[2][8] Ainda de acordo com Chet, o Bash carrega um legado importante para a infraestrutura de computadores e é considerado uma peça essencial para o funcionamento de vários sistemas Linux, macOS e Solaris.[8] Além disso, o Bash foi um dos primeiros programas portados para o kernel do Linux por Linus Torvalds.[8][9]
Características
[editar | editar código]Além de oferecer compatibilidade reversa com o Bourne shell, o Bash extende sua utilidade com funcionalidades únicas e outras incorporadas de projetos como o Korn shell e o C shell (csh e tcsh). As melhorias oferecidas pelo Bash incluem:
- edição de linha de comando;
- 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.[2]
Sintaxe
[editar | editar código]Quaisquer dados inseridos por um usuário na linha de comando ou lidos em um script são interpretados como tokens pelo Bash. Um token pode ser uma palavra ou um operador, que exerce funcionalidades de controle e redirecionamento de dados. Para impedir que operadores, palavras ou caracteres reservados recebam tratamentos especiais, o Bash permite a utilização de aspas simples (') e duplas (") e também da barra inversa (\, para caracteres) para transformá-los em palavras e evitar que alguns campos sejam expandidos. Além disso, textos precedidos por uma cerquilha (#) são ignorados pelo shell e considerados comentários.[3]
Comandos
[editar | editar código]Comandos no Bash seguem uma estrutura simples: após o nome do comando, palavras separadas por espaços em branco (definidos por um sinal de espaço ou de tabulação) são interpretadas como argumentos e transmitidos aos programas. Dois ou mais comandos podem ser encadeados com os operadores | e |&. Comandos compostos são formados a partir de estruturas específicas, como as de repetição (until, while e for) e as de condição (if, case e select).
Comandos encadeados podem ser agrupados com o auxílio de alguns operadores: && (conjunção), || (disjunção), & (envia o processo para o segundo plano) e ;. Além disso, os dois últimos operadores também podem delimitar o fim de uma sequência de comandos, assim como uma quebra de linha (que justifica a execução linha após linha em scripts).[3]
Funções
[editar | editar código]Funções permitem o agrupamento de comandos para serem reutilizados múltiplas vezes ao invocar apenas o nome do grupo. No Bash, elas são definidas através da palavra reservada function ou ao preceder a sequência de procedimentos pelo nome da função, seguido de um par de parênteses.[3]
Parâmetros
[editar | editar código]No Bash, um parâmetro, como uma variável, é uma entidade que armazena valores. Variáveis no Bash são parâmetros identificados por um nome aos quais são atribuídos valores por expressões do tipo nome=valor.
Existem dois outros tipos de parâmetros no Bash: parâmetros posicionais e parâmetros especiais. Aos posicionais, são atribuídos os argumentos fornecidos a um script ou a uma função. Ao invés de nomes, parâmetros posicionais são identificados por números, que correspondem à posição de cada argumento. Além desses, alguns parâmetros recebem tratamentos especiais pelo Bash:
*: expande os parâmetros posicionais como uma única sequência de caracteres;@: expande os parâmetros posicionais como um arranjo, separando cada parâmetro;#: expande para a quantidade de parâmetros posicionais;?: expande para o status de saída do último comando;-: expande para as opções de invocação do shell;$: expande para o identificador de processo do shell;!: expande para o identificador de processo do último programa colocado em segundo plano;0: expande para o nome do shell ou do script.[3]
Expansões
[editar | editar código]Expansões são mecanismos que permitem substituir, gerar e alterar valores relacionados a parâmetros, a comandos e ao ambiente do shell. As seguintes expansões são suportadas pelo Bash:
- expansão de chaves: gera múltiplas sequências de caracteres;
- expansão do til: substitui o sinal diacrítico til (~) pelo diretório pessoal do usuário;
- expansão de parâmetro: expande e manipula o valor de variáveis;
- substituição de comando: substitui um comando pela sua própria a saída;
- expressões aritméticas: validam cálculos e expressões numéricas e os substituem pelos seus resultados;
- substituição de processos: substitui saídas e entradas de comandos por referências a arquivos;
- divisão de palavras: divide uma sequência de caracteres em múltiplas palavras;
- expansão de nome de arquivo: expande padrões, como
*,?e[...]para nomes de arquivos; e - remoção de aspas: remove aspas e barras inversas que não sofreram expansões.[3]
Redirecionamentos
[editar | editar código]É possível manipular os canais de entrada/saída de comandos no Bash, duplicando-os, abrindo-os, fechando-os e redirecionando-os para diferentes arquivos, alterando o fluxo de informações e dados que normalmente seriam exibidos para o usuário, através dos caracteres < e >.[3]
Arquivos de inicialização
[editar | editar código]É possível customizar o ambiente do Bash utilizando alguns arquivos, como:
/etc/profile~/.bash_profile~/.bash_login~/.profile~/.bash_logout~/.bashrc
Quando o Bash é invocado em uma sessão de login, o arquivo /etc/profile, caso exista, é lido e seus comandos são executados. Após isso, ele procura pelos arquivos ~/.bash_profile, ~/.bash_login e ~/.profile, nessa ordem, e executa os comandos do primeiro arquivo existente. Além disso, caso o arquivo ~/.bash_logout exista, seus comandos são executados após uma instrução exit ser fornecida.
Alternativamente, quando executado em uma sessão interativa que não seja de login, o Bash tenta executar os comandos presentes no arquivo ~/.bashrc.[3]
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, como:
- a palavra reservada
!; - o comando interno
command; - melhorias para os comandos internos
read,umasketest; - melhor expansão de comandos com
$(); - expansão de chaves para variáveis com
${}; - possibilidade de definir variáveis e funções com o mesmo nome;
- variáveis locais restritas ao escopo de uma função;
- possibilidade de desativação ou reescrita de comandos internos; e
- correções de vulnerabilidades.[4]
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. Muitas 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;
- melhor expansão de comandos com
$()e de expressões aritméticas com$(()); - novos comandos internos, como o
getopts; - expansão do til (~) para a variável
HOME(herança do C shell); - controle de trabalhos com
jobs,bg,fg,killewait; - histórico e edição de linha de comando com atalhos nos estilos Emacs e vi;
- apelidos (aliases) e construções
select; - extensões para os comandos
exportereadonly; e - variáveis locais restritas ao escopo de uma função.[4]
Exemplos
[editar | editar código]Um exemplo simples de um script comentado em Bash pode ser observado abaixo.
#!/bin/bash
# A linha acima, mesmo comentada (iniciada por #), indica qual interpretador de
# comandos (shell) será usado para interpretar este script. Nesse caso, o Bash.
#
# Limpa a tela:
clear
# Exibe na tela "Olá, ", o nome do usuário e um ponto de exclamação:
echo "Olá, ${USER}!"
# Mostra o diretório de trabalho do usuário no momento da execução do script:
echo "Seu diretório é: $(pwd)"
# Verifica se o comando "uname" (parte do GNU Core Utilities) existe:
if command -v uname 1>/dev/null; then
# Exibe a versão/release do kernel da máquina do usuário:
echo "A versão local do kernel é: $(uname -r)"
# Fecha o escopo da estrutura de condição "if":
fi
Ver também
[editar | editar código]- GNU Readline — biblioteca utilizada pelo Bash para implementar a edição de linha de comando
- GNU Core Utilities
- Shell script
- Bourne shell
Referências
- ↑ «Index of /gnu/bash». Projeto GNU. 30 de julho de 2025. Consultado em 30 de dezembro de 2025. Cópia arquivada em 12 de dezembro de 2025
- ↑ a b c d «GNU Bash». Projeto GNU (em inglês). 22 de setembro de 2020. Consultado em 4 de janeiro de 2026. Cópia arquivada em 20 de dezembro de 2025
- ↑ a b c d e f g h i j «Bash Reference Manual». Projeto GNU (em inglês). 18 de maio de 2025. Consultado em 4 de janeiro de 2026. Cópia arquivada em 18 de dezembro de 2025
- ↑ a b c d e
- Ramey, Chet. «Bash, the Bourne−Again Shell» (PDF). Case Western Reserve University (em inglês). Consultado em 4 de janeiro de 2026. Cópia arquivada (PDF) em 7 de fevereiro de 2025
- Ramey, Chet. «Bash − The GNU shell» (PDF). Case Western Reserve University (em inglês). Consultado em 4 de janeiro de 2026. Cópia arquivada (PDF) em 16 de outubro de 2025
- Ramey, Chet (2011). «The Bourne-Again Shell». In: Brown, Amy; Wilson, Greg. The Architecture Of Open Source Applications. Elegance, Evolution, And A Few Fearless Hacks (em inglês). 1. [S.l.]: Lulu Press, Inc. ISBN 978-1-257-63801-7. Cópia arquivada em 13 de dezembro de 2025
- ↑ Fox, Brian; Tower Jr., Leonard H. (7 de junho de 1989). «Bash is in beta release!». gnu.announce (em inglês). Consultado em 30 de dezembro de 2025. Cópia arquivada em 30 de janeiro de 2025 – via Google Grupos
- ↑ Ramey, Chet (1 de julho de 2025). «The GNU Bourne-Again SHell». Case Western Reserve University (em inglês). Consultado em 30 de dezembro de 2025. Cópia arquivada em 24 de novembro de 2025
- ↑ «What is the Windows Subsystem for Linux?». Microsoft Learn (em inglês). 21 de maio de 2025. Consultado em 30 de dezembro de 2025. Cópia arquivada em 24 de dezembro de 2025
- ↑ a b c d «The A-Z of Programming Languages: BASH/Bourne-Again Shell». Computerworld (em inglês). Consultado em 30 de dezembro de 2025. Arquivado do original em 11 de agosto de 2016
- ↑ Verma, Adarsh (25 de agosto de 2016). «Linus Torvalds's Famous Email — The First Linux Announcement». Fossbytes (em inglês). Consultado em 30 de dezembro de 2025. Cópia arquivada em 23 de novembro de 2025
Ligações externas
[editar | editar código]- «GNU Bash» (em inglês). Página oficial
- «Bash Reference Manual» (em inglês). Manual de referência do Bash
- Shell Script — Aurelio.net. Conjunto de documentações para aprender mais sobre shell scripting com Bash
- Papo de Botequim. Um livro de shell por Júlio Neves