tarcis.io

Guia básico de shell

Em diversos cursos que ministro eu utilizo o terminal como uma ferramenta básica, que está disponível em todas as distribuições Linux por padrão, e até mesmo tem um certo paralelo em outros sistemas operacionais, como o Windows.

Dito isso, diversos alunos que atendo têm pouca familiaridade com o Terminal, seja por serem pouco familiares com o sistema operacional, com desenvolvimento de software no geral, ou por estarem acostumados com ferramentas gráficas mais específicas.

Buscando levar aos alunos a base necessária para os cursos, este texto traz uma introdução ao uso do terminal, com o uso básico pra manipulação de arquivos e para o uso dos comandos que são introduzidos ao longo das aulas.

Glossário

Vamos começar com um glossário para deixar nossos termos claros antes de continuarmos, pois como é de costume em desenvolvimento de software, o jargão pode acabar ficando bem denso. Você pode ver na Figura 1 alguns dos termos apontados em um exemplo ilustrativo:

diagrama de um terminal com saída de um comando

Figura 1: Diagrama de um terminal.

Abrindo um terminal

Com a terminologia acima bem definida, vamos então a abrir um terminal. Essa tarefa geralmente é simples, porém totalmente dependente do sistema gráfico e da distribuição que estamos usando.

Geralmente, há um atalho configurado para abrir um terminal. Os mais comuns são:

Outra opção é procurar nos menus do seu sistema, ou utilizar a busca, para procurar algo como "Terminal", "Console" ou "Linha de Comando".

Quando conseguirmos um terminal aberto, geralmente vemos uma linha com um conteúdo semelhante ao seguinte (se o seu for diferente, não se preocupe!):

user@host ~ $ _

Na linha acima, o _ indica o cursor do terminal, ou seja, onde o texto que digitarmos irá aparecer.

Na linha que estamos vendo, temos o nome do nosso usuário (no exemplo, user), um @ indicando que estamos em um computador, ou seja, nosso host, e um hostname, que é o nome dado ao computador que estamos usando (no exemplo, host).

Na sequência, é comum vermos um ~. Isso indica que no momento, estamos no diretório home do usuário. O caminho completo da home de um usuário user, no Linux, costuma ser /home/user. Porém, no shell, é comum utilizarmos o símbolo ~ como uma abreviação para este diretório.

Depois disso, temos o $. Ele indica o final do prompt, e que o terminal aguarda que entremos com algum comando para ser executado. É bastante comum, para indicar que algo deve ser executado em um terminal, colocar um $ na frente. Você certamente verá isso em textos, documentações, tutoriais e afins.

Comandos de navegação

Uma vez que temos um terminal aberto, os primeiros comandos que veremos são os que nos permitem navegar entre diretórios (também conhecidos como pastas). Normalmente, ao abrirmos o terminal, ele já abre na pasta home do usuário, como vimos antes.

Vamos a eles!

pwd

Apesar de o prompt geralmente nos informar onde estamos, caso isso não aconteça, ou caso queiramos ver uma versão por extenso do caminho do diretório, podemos utilizar o comando pwd:

user@host ~ $ pwd
/home/user

O comando pwd vem do termo cwd, que é o current working directory, ou seja, o diretório sobre o qual estamos trabalhando no momento. A letra p vem de print, que é um termo comum para se referir a escrever texto em um terminal.

ls

Agora que sabemos onde estamos, certamente iremos querer saber o que existe dentro do diretório atual. Para fazer isso, utilizamos o comando ls, que vem de list:

user@host ~ $ ls
(...)
Downloads
Documents
(...)
Pictures
(...)

Em cada computador a saída deste comando irá variar, certamente. No exemplo, os (...) indicam que pode haver mais coisa na saída.

O comando ls pode receber um ou mais argumentos, ou seja, valores extras na linha de comando, que indicam que seu comportamento deve se alterar. No caso do ls, ao receber argumentos, ele deixa de listar o diretório atual, e passa a tentar listar os diretórios que recebeu:

user@host ~ $ ls Downloads Documents
Downloads:
musicas_legalmente_obtidas/
musicas_legalmente_obtidas.zip
tutorial_shell.txt

Documents:
'Comprovante Pagamento Action Figures.pdf'
Contrato.docx
ebooks/

cd

Agora que sabemos onde estamos e o que temos por perto, podemos começar a nos mover. O comando cd, de change directory, é o primeiro dentre os que listamos que é sempre um builtin, ou seja, é provido pelo próprio shell, e não implementado em um executável separado. Isso ocorre pois ele precisa de fato alterar o estado atual do shell. Vejamos ele em ação:

user@host ~ $ cd Documents
user@host Documents $ ls
'Comprovante Pagamento Action Figures.pdf'
Contrato.docx
ebooks/
user@host Documents $ pwd
/home/user/Documents

Podemos observar que mudamos de diretório pelo prompt e pelo comando pwd. A saída do comando ls sem argumentos também mudou, mostrando mais uma vez que estamos em um local diferente.

Com o que vimos, somos capazes de entrar em diretórios que estão aninhados no nosso diretório atual. Mas e se quisermos voltar para um diretório anterior, o que podemos fazer? Aproveite para tentar pensar em uma possibilidade!

Pensou? Se você lembra da saída do comando pwd, que mostra um diretório por extenso, lembra que o diretório anterior era /home/user. Podemos utilizar esse conhecimento para voltarmos para lá com o que chamamos de caminho absoluto, ou seja, o caminho completo do diretório onde estamos, desde a raiz do sistema de arquivos:

user@host Documents $ cd /home/user
user@host ~ $

Outra opção que temos é utilizar a abreviação ~, como mencionamos antes:

user@host Documents $ cd ~
user@host ~ $

Agora, duas outras possibilidades que não seriam simples de adivinhar: a primeira é simplesmente utilizar cd, sem argumentos, cujo comportamento é equivalente a cd ~.

user@host Documents $ cd
user@host ~ $

E, por fim, uma opção mais específica para o que queremos fazer. Em todos os diretórios, existe um subdiretório "fictício" chamado ... Esse subdiretório na verdade não fica dentro do diretório, e sim fora. Ele nos leva diretamente ao diretório anterior, também chamado de pai, do que estamos:

user@host Documents $ cd ..
user@host ~ $ cd ..
user@host /home $ cd ..
user@host / $

Comandos para alterar arquivos e diretórios

Agora que sabemos navegar, explorar e como nos localizarmos, vamos ver como podemos interagir com os arquivos e diretórios que estamos vendo.

mv

O primeiro comando que veremos é o mv, de move. Apesar do nome, ele é útil não apenas para mover arquivos e diretórios, mas também para renomeá-los. Por exemplo:

user@host Documents $ ls
'Comprovante Pagamento Action Figures.pdf'
Contrato.docx
ebooks/
user@host Documents $ mv Contrato.docx 'Contrato Prestação de Serviço.docx'
user@host Documents $ ls
'Comprovante Pagamento Action Figures.pdf'
'Contrato Prestação de Serviço.docx'
ebooks/

Perceba também o uso das aspas. Elas são necessárias para que o comando entenda um nome de arquivo com espaços como um argumento único.

Se quisermos mover sem renomear, passamos ao comando um caminho terminado em um outro diretório que já exista:

user@host Documents $ mv 'Contrato Prestação de Serviço.docx' ..
user@host Documents $ ls
'Comprovante Pagamento Action Figures.pdf'
ebooks/
user@host Documents $ ls ..
(...)
'Contrato Prestação de Serviço.docx'
(...)

mkdir

O comando mkdir (de make directory) cria diretórios. Ele será usado principalmente de duas maneiras:

Para criar um diretório em algum lugar que já exista, basta utilizar o comando com o caminho como argumento:

user@host ~ $ mkdir Documents/contratos
user@host ~ $ ls Documents
'Comprovante Pagamento Action Figures.pdf'
contratos/
ebooks/

Para criar diversos diretórios aninhados, que ainda não existem, utilize a opção -p, de parents:

user@host ~ $ mkdir Documents/recibos/antigos
user@host ~ $ ls Documents
'Comprovante Pagamento Action Figures.pdf'
contratos/
ebooks/
recibos/
user@host ~ $ ls Documents/recibos
antigos/

cp

Para copiar arquivos, utilizamos o comando cp, de copy:

user@host Documents $ cp 'Comprovante Pagamento Action Figures.pdf' action-figures.pdf
user@host Documents $ ls
action-figures.pdf
'Comprovante Pagamento Action Figures.pdf'
contratos/
ebooks/
recibos/

Quando queremos copiar diretórios, junto com seus conteúdos, basta utilizar a opção -r, de recursive.

user@host Documents $ cp -r ebooks ..
user@host Documents $ ls
action-figures.pdf
'Comprovante Pagamento Action Figures.pdf'
contratos/
ebooks/
recibos/
user@host Documents $ ls ..
(...)
ebooks/
(...)

rm

Para apagar arquivos, utilizamos o comando rm, de remove. É importante notar que os arquivos removidos desta maneira não são recuperáveis. Eles não são movidos para uma "lixeira", e sim realmente removidos.

Sabendo disso, para utilizar o rm fazemos:

user@host Documents $ rm 'Comprovante Pagamento Action Figures.pdf'
user@host Documents $ ls
action-figures.pdf
contratos/
ebooks/
recibos/

E para remover diretórios e todo seu conteúdo, da mesma forma que com o cp, basta utilizar a opção -r:

user@host Documents $ rm -r ebooks
user@host Documents $ ls
action-figures.pdf
contratos/
recibos/

Conclusão

Conhecendo os comandos anteriores, navegação e uso básico do terminal deve agora estar ao seu alcance! Em relação ao uso deste post como material de apoio para meus materiais de ensino, é bom ressaltar que outros comandos mais específicos são explicados durante os cursos (e no material que os acompanha).

Espero que esta introdução tenha sido útil, e boa sorte nas suas aventuras utilizando o terminal!