Linux · Capítulo 3

Linux Essentials: orientando-se em um sistema Linux

Primeiros passos no shell: sintaxe de comandos, aspas e variáveis, PATH, como pedir ajuda, caminhos, arquivos e curingas.

Este capítulo cobre o tema 2 do exame Linux Essentials: movimentar-se por um sistema Linux pela linha de comando. É aqui que a teoria vira prática, então abra um terminal e vá testando cada comando.

O shell

O shell ou interpretador de comandos é o programa que recebe as ordens que você digita no teclado e as repassa ao sistema operacional. Também é chamado de terminal ou linha de comando, embora, a rigor, o terminal seja a janela e o shell, o programa que roda dentro dela.

Shell Características
Bash O mais difundido; o shell padrão na maioria das distribuições. É o do exame.
sh O shell clássico do Unix; base do padrão POSIX.
zsh Compatível com o Bash e muito configurável; o shell padrão no macOS.
csh / tcsh Sintaxe parecida com a linguagem C.
fish Pensado para ser amigável, com sugestões automáticas.
echo $SHELL        # qual shell seu usuário usa
clear              # limpa a tela (ou Ctrl + L)
pwd                # print working directory: em que diretório você está

Anatomia de um comando

Um comando tem três partes: o comando, suas opções (mudam como ele se comporta e costumam começar com - ou --) e seus argumentos (sobre o que ele atua).

As partes de um comando: comando, opções e argumentos

ls                 # comando sozinho
ls -l              # comando + opção
ls -l /home        # comando + opção + argumento
ls -la /home       # várias opções curtas juntas: -l e -a
ls --all /home     # opção longa

Nos comandos GNU a ordem de opções e argumentos costuma ser flexível (ls /home -la também funciona), mas a convenção é comando, opções, argumentos.

Mostrar texto: echo e as aspas

echo "Olá mundo"
echo -e "Olá\tmundo"       # -e interpreta \t (tabulação)
echo -e "Olá\nmundo"       # e \n (quebra de linha)

As aspas mudam como o shell trata o texto:

Aspas Comportamento Exemplo
Duplas "..." Expandem as variáveis ($VAR) e os comandos $(...). echo "Seu PATH é $PATH"
Simples '...' Tudo é literal: nada é expandido. echo 'Seu PATH é $PATH'
Barra invertida \ Escapa um único caractere. echo "Custa \$5"
echo "Hoje é $(date +%A)"    # substituição de comandos

Saber o que é cada comando: type, which, uname, whatis

type cd          # cd is a shell builtin   (comando interno do Bash)
type ls          # pode ser um alias de ls --color=auto
type cp          # cp is /usr/bin/cp       (programa externo)

which cp         # caminho do executável: /usr/bin/cp

uname            # nome do kernel: Linux
uname -a         # todas as informações: versão, arquitetura, nome da máquina...
cat /etc/os-release   # nome e versão da distribuição

A diferença importa: os comandos internos (builtins) fazem parte do próprio shell; os externos são programas em disco que o shell procura nos diretórios do PATH.

Variáveis: set, export, unset e env

saudacao="olá"           # variável local do shell (sem espaços em volta do =)
echo $saudacao

export EDITOR=nano       # variável de ambiente: herdada pelos programas que você abrir
env                      # lista as variáveis de ambiente
set                      # lista variáveis e funções do shell
unset saudacao           # remove a variável

set +o history           # desativa o histórico nesta sessão
set -o history           # reativa

A variável PATH

PATH contém a lista de diretórios, separados por :, onde o shell procura os comandos externos. Graças a ela você digita ls em vez de /usr/bin/ls.

echo $PATH
# /usr/local/bin:/usr/bin:/bin:...

Para executar seus próprios scripts de qualquer diretório, adicione a pasta deles ao PATH:

mkdir -p ~/scripts
export PATH="$PATH:$HOME/scripts"

Essa mudança dura só até a sessão terminar. Para torná-la permanente, salve-a em ~/.bashrc (no zsh, ~/.zshrc) e recarregue o arquivo:

echo 'export PATH="$PATH:$HOME/scripts"' >> ~/.bashrc
source ~/.bashrc

Use aspas simples no echo: assim o texto $PATH é salvo como está e expandido ao abrir cada sessão. Com aspas duplas, seria salvo o valor atual completo.

Seu primeiro script e o shebang

A primeira linha de um script, o shebang, indica qual interpretador deve executá-lo:

#!/bin/bash
# ~/scripts/ola.sh
echo "Olá, $USER"
echo "Hoje é $(date +%d/%m/%Y)"
chmod +x ~/scripts/ola.sh   # dar permissão de execução
ola.sh                      # funciona de qualquer lugar se ~/scripts estiver no PATH
./ola.sh                    # se não, execute indicando o caminho

Como pedir ajuda

Ferramenta Para que serve
comando --help Resumo rápido das opções.
man comando O manual completo. Navega-se com as setas, / busca, q sai.
info comando Documentação mais extensa, com links entre seções.
whatis comando Descrição de uma linha (igual a man -f).
apropos palavra Busca a palavra nas descrições dos manuais (igual a man -k).
locate arquivo Encontra arquivos pelo nome usando um banco de dados atualizado com updatedb.
whereis comando Onde estão o binário, o código-fonte e o manual de um comando.
/usr/share/doc/ Documentação adicional dos pacotes instalados.

O manual é dividido em seções. A mesma palavra pode aparecer em várias:

Seção Conteúdo
1 Comandos de usuário
5 Formatos de arquivos de configuração
8 Comandos de administração do sistema
man passwd       # seção 1: o comando passwd
man 5 passwd     # seção 5: o arquivo /etc/passwd
man -f cp        # = whatis cp
man -k copy      # = apropos copy

Diretórios e caminhos

O sistema de arquivos do Linux é uma árvore que começa na raiz, /. Cada usuário tem seu diretório pessoal, normalmente /home/usuario, que também pode ser escrito como ~.

Caminhos absolutos e relativos na árvore de diretórios

  • Um caminho absoluto começa em / e vale de qualquer lugar: /home/usuario/documentos/notas.txt
  • Um caminho relativo parte do diretório onde você está e não começa com /: se você está em /home/usuario, o mesmo caminho é documentos/notas.txt.
  • . é o diretório atual e .. o diretório pai.

Movimentar-se com cd

cd               # ir para o seu diretório pessoal (igual a cd ~)
cd /etc          # caminho absoluto
cd documentos    # caminho relativo
cd ..            # subir para o diretório pai
cd -             # voltar ao diretório anterior
cd /             # ir para a raiz

Listar com ls

ls -a        # inclui arquivos ocultos (começam com .)
ls -l        # formato longo: permissões, proprietário, tamanho, data
ls -lh       # tamanhos legíveis (K, M, G)
ls -S        # ordena por tamanho, o maior primeiro
ls -lr       # ordem inversa
ls -R        # recursivo: entra nos subdiretórios

Criar, mover, copiar e apagar

touch notas.txt              # cria um arquivo vazio (ou atualiza sua data)

mkdir projetos               # cria um diretório
mkdir dir1 dir2 dir3         # vários de uma vez
mkdir -p cursos/linux/lpi    # cria também os diretórios intermediários
mkdir "minhas fotos"         # nome com espaços (ou: mkdir minhas\ fotos)

cp notas.txt copia.txt       # copia um arquivo
cp -r projetos backup        # copia um diretório inteiro

mv notas.txt projetos/       # move
mv copia.txt resumo.txt      # renomeia

rm resumo.txt                # apaga um arquivo
rmdir dir1                   # apaga um diretório vazio
rm -r backup                 # apaga um diretório e todo o seu conteúdo

Cuidado: o rm não usa lixeira. O que você apaga desaparece. Acrescente -i para que ele peça confirmação.

Uma diferença que cai no exame: o mv mantém o proprietário e as permissões do arquivo, porque não cria um novo; o cp cria um arquivo novo que pertence ao usuário que copia.

E lembre-se: o Linux diferencia maiúsculas de minúsculas. Notas.txt e notas.txt são arquivos diferentes.

O histórico

history          # lista os comandos executados, numerados
!123             # repete o comando número 123
!!               # repete o último comando

Ctrl + R busca para trás no histórico enquanto você digita.

Curingas (globbing)

Os curingas permitem se referir a vários arquivos de uma vez. O shell os expande antes de executar o comando.

Curinga Significado Exemplo Corresponde a
* Qualquer quantidade de caracteres (até nenhum) ls *.txt notas.txt, a.txt
? Exatamente um caractere ls foto?.jpg foto1.jpg, fotoA.jpg
[abc] Um dos caracteres indicados ls relatorio[123].pdf relatorio1.pdf, relatorio3.pdf
[a-z] Um caractere do intervalo ls [a-c]* arquivos que começam com a, b ou c
[!abc] Qualquer caractere exceto esses ls [!0-9]* arquivos que não começam com dígito
[[:digit:]] Uma classe de caracteres (dígitos, letras...) ls *[[:digit:]].log app1.log, app2.log
ls *.txt                  # todos os .txt
ls ??.conf                # nomes de dois caracteres terminados em .conf
cp *.jpg ~/fotos/         # copia todas as imagens .jpg
rm log-2026-0[1-3]-*.txt  # apaga os logs de janeiro a março

Uma dica ao montar padrões: comece pela parte mais distintiva, que muitas vezes está no final do nome (a extensão), e vá acrescentando condições para a esquerda.

Ideias-chave

  • O shell (Bash) interpreta o que você digita; a sintaxe é comando, opções, argumentos.
  • As aspas duplas expandem variáveis; as simples, não.
  • type distingue comandos internos de externos; which mostra o caminho de um executável.
  • PATH diz onde procurar comandos; para mudanças permanentes, ~/.bashrc.
  • Ajuda: --help, man (com seções), info, whatis, apropos, locate.
  • Caminhos absolutos começam em /; os relativos, no diretório atual. ., .., ~.
  • O mv mantém o proprietário; o cp cria um arquivo novo. O Linux diferencia maiúsculas.
  • Curingas: *, ?, [...], [!...] e classes como [[:digit:]].