Se o seu objetivo é se tornar um mestre do shell Bash em sistemas como Linux, macOS ou similares ao UNIX, compreender os caracteres especiais (como ~, *, | e >) é crucial. Este guia visa desvendar esses comandos do Linux, transformando você num verdadeiro expert.
O que são Caracteres Especiais no Bash?
O shell Bash interpreta certos caracteres de duas maneiras distintas. Ao digitá-los no shell, atuam como instruções ou comandos, indicando ao shell uma função específica a ser executada. Considere-os como comandos de um único caractere.
No entanto, por vezes, o que se pretende é simplesmente exibir um caractere, sem que este desempenhe qualquer função mágica. Existe, portanto, um método para utilizar um caractere para representar a si próprio, em vez da sua função especial.
Apresentaremos os caracteres “especiais” ou “meta-“, e como empregá-los tanto funcional quanto literalmente.
~ Diretório Home
O símbolo til (~) representa uma abreviação do seu diretório pessoal. Isso permite que você evite digitar o caminho completo para o seu diretório home nos comandos. Independentemente da sua localização no sistema de arquivos, use o seguinte comando para retornar ao seu diretório inicial:
cd ~
Esta abreviação também é útil com caminhos relativos. Por exemplo, se você estiver numa localização fora da sua pasta pessoal e quiser navegar até o diretório “arquivo” dentro da sua pasta “trabalho”, utilize o til:
cd ~/trabalho/arquivo
. Diretório Atual
Um ponto (.) representa o diretório no qual você está atualmente. Ele se torna visível ao usar a opção “-a” (all) com o comando ls, que lista todos os arquivos e diretórios.
ls -a
O ponto também pode ser usado em comandos para referenciar o caminho do diretório atual. Por exemplo, para executar um script no diretório atual, utilize:
./script.sh
Isso instrui o Bash a procurar o arquivo “script.sh” no diretório atual, evitando a busca em diretórios listados no seu PATH.
.. Diretório Pai
Dois pontos (..) representam o diretório pai do diretório atual. É útil para subir um nível na hierarquia de diretórios.
cd ..
Este comando também pode ser combinado com caminhos relativos. Por exemplo, para subir um nível e entrar num diretório diferente nesse mesmo nível, execute:
cd ../ajuda_gc
/ Separador de Diretório
A barra (/) é utilizada para separar os diretórios num caminho.
ls ~/trabalho/arquivo
Uma única barra representa o diretório raiz, o ponto de partida da hierarquia de diretórios do Linux. Use este comando para ir diretamente para o diretório raiz:
cd /
# Comentário ou Corte de Strings
O símbolo cerquilha (#) geralmente indica que o texto seguinte é um comentário e deve ser ignorado pelo shell. Pode ser usado em scripts shell e, de forma menos comum, na linha de comando.
# Este texto será ignorado pelo Bash
Embora ignorado para execução, ele é adicionado ao histórico de comandos.
A cerquilha também pode ser usada para remover texto no início de uma variável de string. Criamos a variável “esta_string” com o valor “Fulano Geek!”.
esta_string="Fulano Geek!"
Usamos “echo” para imprimir “Tutorial” e, por meio de expansão de parâmetro, recuperamos o valor da variável, eliminando o texto “Fulano”.
echo Tutorial ${esta_string#Fulano}
Isso não altera o valor da variável, mas apenas o que é exibido por “echo”. Verificamos o valor original:
echo $esta_string
? Curinga de Caractere Único
O shell Bash utiliza curingas para substituir caracteres em padrões de nomes de arquivos. Um curinga em um nome de arquivo define um padrão que pode corresponder a múltiplos arquivos, e não apenas um.
O ponto de interrogação (?) representa exatamente um caractere. O padrão a seguir lista arquivos com nomes começando com “emblema”, seguido de qualquer caractere antes da extensão “.txt”:
ls emblema?.txt
Este padrão corresponde a arquivos como “emblema1.txt”, “emblemaA.txt”, etc. O curinga “?” aceita letras ou números. Não corresponderá a “emblema.txt” porque exige um caractere adicional.
O ponto de interrogação também pode ser usado para listar arquivos com um número específico de caracteres. O comando a seguir lista todos os arquivos “.txt” com exatamente cinco caracteres no nome:
ls ?????.txt
* Curinga de Sequência
O asterisco (*) representa qualquer sequência de caracteres, incluindo nenhum. O padrão abaixo lista todos os arquivos com nomes que iniciam com “emblema”:
ls emblema*
Ele corresponderá a “emblema.txt” e também a qualquer sequência de caracteres após “emblema”.
Este comando lista todos os arquivos com o nome “fonte”, independentemente da extensão:
ls fonte.*
[] Curinga de Conjunto de Caracteres
Usando os colchetes ([ ]), criamos um curinga que corresponde a um caractere presente dentro do conjunto definido. O caractere no nome do arquivo deve corresponder a pelo menos um caractere no conjunto.
O exemplo abaixo lista arquivos com extensão “.txt”, nome começando com “emblema_0” e o próximo caractere sendo 2, 4 ou 6:
ls emblema_0[246].txt
Podemos usar múltiplos conjuntos de colchetes:
ls emblema_[01][789].txt
Também podemos incluir intervalos:
ls emblema_[23][1-5].txt
; Separador de Comandos
Vários comandos podem ser digitados na mesma linha, desde que separados por ponto e vírgula (;). No exemplo abaixo, realizamos três operações.
ls > contagem.txt; wc -l contagem.txt; rm contagem.txt
O segundo comando executa mesmo que o primeiro falhe, e assim por diante.
Para interromper a execução em caso de falha de um comando, utilize “&&” em vez de “;”:
cd ./naoexiste && cp ~/Documentos/relatorios/* .
& Processo em Segundo Plano
Normalmente, após executar um comando no terminal, este volta ao prompt de comando após a conclusão. Entretanto, ao iniciar aplicativos como o gedit, o terminal fica bloqueado até o fechamento do aplicativo.
Para evitar isso, execute um aplicativo em segundo plano adicionando “&” ao final do comando:
gedit endereco_comando.pagina &
O Bash exibirá o ID do processo, e o terminal estará pronto para novos comandos.
< Redirecionamento de Entrada
Comandos que aceitam arquivos como parâmetros também podem receber dados através de um fluxo. Para criar um fluxo, use o sinal de menor que (<).
sort < palavras.txt
Comandos com entrada redirecionada podem se comportar de forma diferente do que ao ler de um arquivo nomeado. O comando “wc”, por exemplo, imprime os valores numéricos e o nome do arquivo ao receber um arquivo como parâmetro. Se os dados forem fornecidos por um fluxo, ele só imprimirá os valores, desconhecendo o nome do arquivo original.
Alguns exemplos de uso do “wc”:
wc palavras.txt
wc < palavras.txt
> Redirecionamento de Saída
O sinal de maior que (>) redireciona a saída de um comando, geralmente para um arquivo. Exemplo:
ls > arquivos.txt
cat arquivos.txt
O redirecionamento de saída também pode redirecionar mensagens de erro usando o número 2 com >.
wc naoexiste.txt 2> erros.txt
cat erros.txt
| Pipe
O “pipe” (|) encadeia comandos, enviando a saída de um comando como entrada para o próximo. O comprimento da cadeia é arbitrário.
O exemplo a seguir usa “cat” para enviar o conteúdo de “palavras.txt” para “grep”, que extrai linhas contendo “C” (maiúsculo ou minúsculo). “grep” envia os resultados para “sort”, que ordena em ordem reversa (opção -r).
cat palavras.txt | grep [cC] | sort -r
! Negação Lógica e Operador de Histórico
O ponto de exclamação (!) é um operador lógico que significa NÃO.
[ ! -d ./backup ] && mkdir ./backup
Este comando contém dois comandos: o primeiro dentro dos colchetes e o segundo após “&&”.
O primeiro comando testa a existência de um diretório “backup” usando a opção “-d”. O segundo comando cria o diretório.
“&&” faz com que o segundo comando seja executado apenas se o primeiro tiver sucesso. No entanto, precisamos do oposto. Se “backup” existir, não precisamos criá-lo. Se não existir, precisamos criá-lo. É aí que o operador “!” entra em ação.
O operador “!” inverte o resultado. Se o diretório existir (sucesso), “!” transforma em “não sucesso” (falha), impedindo a criação. Se o diretório não existir (falha), “!” transforma em “não falha” (sucesso), ativando a criação.
Para verificar o status do diretório, use:
ls -l -d backup
Você também pode executar comandos do histórico usando o ponto de exclamação e o número do comando no histórico. Digitar “!24” executa o 24º comando do histórico.
!24
“!!” executa o comando anterior.
!!
$ Expressões de Variáveis
No Bash, variáveis armazenam valores, incluindo variáveis de ambiente, que existem em todas as janelas de terminal, contendo informações como seu nome de usuário, diretório inicial e PATH.
Podemos visualizar seus valores com o comando “echo”, adicionando “$” antes do nome da variável:
echo $USER
echo $HOME
echo $PATH
Para criar variáveis, forneça um nome e valor. O “$” é usado apenas para referenciar a variável:
EstaDistro=Ubuntu
MeuNumero=2001
echo $EstaDistro
echo $MeuNumero
Adicione chaves ({}) para realizar transformações:
MinhaString=123456qwerty
echo ${MinhaString}
Para retornar uma substring a partir da posição 6:
echo ${MinhaString:6}
Para retornar uma substring começando na posição zero e com seis caracteres:
echo ${MinhaString:0:6}
Para retornar uma substring começando na posição 4 e com quatro caracteres:
echo ${MinhaString:4:4}
” Protegendo Caracteres Especiais
Para usar caracteres especiais como caracteres literais, informe o shell Bash através da técnica de “proteção”. Há três maneiras de fazer isso.
Usar aspas duplas (“…”) impede que o Bash interprete a maioria dos caracteres especiais, exceto o cifrão ($), que ainda funciona para expressões de variáveis:
echo "Hoje é $(date)"
Usar aspas simples (‘…’) impede a interpretação de todos os caracteres especiais:
echo 'Hoje é $(date)'
A barra invertida () impede que o próximo caractere seja interpretado como especial, é chamado de “escape”:
Pense nos caracteres especiais como comandos abreviados. Dominar seus usos aprofunda a compreensão do shell Bash e dos scripts em geral.