Domine o Bash: Guia Completo de Caracteres Especiais (Linux/macOS)

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.