Obtendo ajuda e navegando pelo filesystem
Last updated
Last updated
A primeira situação que irá ocorrer em um novo usuário Linux quando está de frente com a linha de comando é ter dúvidas quanto aos comandos executados. Claro, os comandos podem ser procurados na internet, mas é bem mais conveniente utilizar o próprio terminal para isso.
Há duas formas principais para se obter ajuda de comandos e executáveis: --help
e man
.
Ao executar um comando, repassando apenas o parâmetro --help, é retornado um pequeno resumo do que é aquele comando e quais parâmetros ele recebe.
Vejamos os usos do comando who
, com who --help
:
Aqui nos é retornado informações básicas de uso e funcionalidade do programa (1) e quais parâmetros ele aceita (2).
Prática: A partir desse resultado, você conseguiria informar um parâmetro que retorna informações sobre o último horário que o computador ligou?
O man
, de manual, é um comando mais completo que usar o parâmetro --help
, e bem mais organizado, separando a funcionalidade principal do comando, da sinopse, exemplos, autor, copyright, entre outras informações.
O uso mais básico é man nomedocomando
. Abaixo está o resultado da execução de man who
.
O man
conta com diversas seções para diferentes tipos de manuais, incluindo ajuda para comandos, bibliotecas, formatos de arquivos e até mesmo jogos. Elas são numeradas de 1 a 9 e estão disponíveis via man man
. Abaixo está uma tabela com a descrição de cada seção
1
Comandos e executáveis
2
System calls (para programação a nível de sistema)
3
Library calls (para ajuda em funções programação em alto nível, como C - printf, scanf etc)
4
Arquivos especiais - geralmente residentes em /dev
5
Formatos de arquivos e convenções
6
Jogos
7
Miscelânia e convenções
8
Comandos de administração
9
Rotinas de kernel
Logo, quando executamos man comando
, o man
irá buscar o primeiro manual que encontrar uma referência para comando
, seguindo uma ordem predefinida - não necessariamente a da tabela acima. Quando sabemos exatamente qual seção queremos ler, podemos indicar ela através de man numerodasecao comando_ou_o_que_procurar
.
Prática: Dado as informações discutidas acima, procure no manual informações sobre o arquivo
passwd
- não se engane com o manual do binário!
NOTA: Apesar de
--help
eman
estarem disponíveis para boa parte dos executáveis/comandos, não é regra que todos eles tenham uma entrada de ajuda - em especial os de terceiros e closed source.
Às vezes, queremos nos aventurar por mais comandos e aumentar nosso conhecimento sobre shell. Para procurar comandos, há o apropos
e o man -k
, ambos equivalentes, que recebem um termo de pesquisa, como "text editor" e procuram por comandos que tenham relação com esse termo.
Para termos que contenham espaços, utilize aspas para delimitá-los. A questão de espaços no shell será tratado em um outro momento.
O resultado será a lista de comandos que tiveram match com o termo, sua descrição e, entre parênteses, qual a seção do man
deve ser usada para buscar mais informações sobre o comando.
Prática: Busque por comandos utilizando
apropos
ouman -k
Esse comando é bem direto: cd
(change directory), passando como parâmetro a localização a qual deseja alterar o diretório. Com o comando pwd
é possível confirmar que o diretório foi alterado com sucesso.
Alguns atalhos úteis:
Mudando para o diretório anterior: cd -
Mudando para o diretório pai: cd ..
Mudando para a própria home: cd
ou cd ~
Mudando para a home de outro usuário: cd ~nomedousuario
Para listar diretórios, podemos usar o ls
, sem argumentos ou repassando opções e os diretórios (caminho relativo ou absoluto).
Algumas opções úteis para utilizar com o ls:
-l - modo de lista detalhado, com informações de quais usuários podem interagir com o arquivo
-a / -A - mostrar os diretórios e arquivos ocultos (que no Linux começam com ponto, como .local
)
-1 - lista um diretório/arquivo por linha. Útil para iteração de diretórios em scripts.
-t - ordenar por tempo de modificação (modificados recentemente no topo).
-r - ordem reversa da ordenação utilizada - se utilizado com -t, por exemplo, mostrará os arquivos modificados recentemente no fim do output.
-h - junto da opção -l, mostra os tamanhos dos arquivos em unidades legíveis por seres humanos (kB, MB, GB...).
É possível concatenar mais de um parâmetro usando apenas um traço. Por exemplo,
ls -l -a -h
é a mesma coisa de executarls -lah
Vamos voltar para o output do ls -l
. A primeira coluna (em vermelho) representa o tipo do arquivo e as permissões para cada tipo de acesso. A terceira e a quarta colunas informam,respectivamente, qual usuário e grupo são donos do arquivo em questão.
O dono pode mudar as permissões do arquivo para ele, para o grupo e outros usuários quando desejar
Abaixo está uma descrição detalhada de como interpretar essa coluna.
A entrada consiste em 10 bits, sendo um para informar o tipo de arquivo e nove para permissões, subdividios em 3 blocos de 3 bits cada.
O primeiro bit da entrada representa o tipo de arquivo: -
para arquivos comuns, d
para diretórios (sim, Linux considera diretório um arquivo - um arquivo que contém outros!). A título de curiosidade, há outros tipos, como b
para dispositivos de bloco, c
para os de caractere, mas não trataremos deles por agora.
Os seguintes 3 bits (em azul na figura) representam as permissões de leitura (R), escrita (W) e execução (X), nessa ordem, para o usuário que possui o arquivo. Um -
significa que aquela permissão não está definida.
Os próximos 3 bits (em verde na figura) representam as permissões de leitura (R), escrita (W) e execução (X), nessa ordem, para o grupo que possui o arquivo. Um -
significa que aquela permissão não está definida.
Os últimos 3 bits (em vermelho na figura) representam as permissões de leitura (R), escrita (W) e execução (X), nessa ordem, para os demais usuários. Um -
significa que aquela permissão não está definida.
Nesse caso, o arquivo tem como user o root, que tem permissões totais (leitura, escrita e execução), o grupo root só não pode escrever, e os outros usuários também.
Curiosidade: o usuário root é o único que não tem restrições de permissão, pois ele consegue ler/escrever em qualquer arquivo, independente da configuração realizada pelos usuários.
Para criar diretórios, utilize o comando mkdir
(make directory). Seu uso é mkdir nomedodiretorio
. Lembre-se de colocar novodiretorio
dentro de aspas duplas ou simples caso contenha espaços.
A criação de múltiplos diretórios também é possível: é necessário apenas passá-los na mesma linha, separando cada um por um espaço (sem aspas), como em mkdir dir1 dir2 dir3 dir4
. Entretanto, para criar um diretório dentro de outro que não é existente, como em nonexistent/mydir, o mkdir resultará em erro:
Para resolver isso, utilizaremos a opção -p
, que criará os diretórios caso não existam, efetivamente criando uma árvore de diretórios.
O comando touch serve para criar arquivos vazios e também modificar o timestamp de acesso dos arquivos. Por agora, iremos utilizar apenas a função de criar arquivos.
Sua sintaxe é semelhante ao mkdir
, e portanto podemos criar vários arquivos executando touch arq1 arq2 arq3
.
É possível criar arquivos vazios ou com conteúdo diretamente da linha de comando utilizando redirecionamentos - abordados na seção Redirecionando inputs e outputs.
A remoção de arquivos é uma operação que deve ser realizada com cautela! Quaisquer arquivos deletados via linha de comando serão removidos permanentemente.
Tecnicamente, um arquivo removido pelo rm sofrerá um processo de "unlinking", no qual a referência para o arquivo no filesystem é removida, mas seu conteúdo continua lá. Seu conteúdo só será removido quando o sistema operacional decidir colocar algum dado novo nas localizações de memória que restaram.
Para essa tarefa, há dois comandos:
rm
- remove um ou mais arquivos, utilizando a sintaxe rm arq1 arq2 arq3
rmdir
- remove um ou mais diretórios vazios.
Para remoção de diretórios via comando rm
, utilize a opção -r
, de recursive. Em resumo, esse comando irá entrar entrar no diretório, apagar todos os arquivos (e os arquivos de todos os subdiretórios) e por fim apagar o diretório vazio.
A cópia de um arquivo pode ser feita através do comando cp arquivo arquivo-copia
. Alguns usos a mais do cp:
Copiando diretórios: cp -r diretorioexistente copiadiretorio
Copiando múltiplos arquivos para um diretório existente: cp arq1 arq2 arq3 diretorioexistente
Copiando os arquivos de um diretório para outro diretório existente: cp -r diretorio1/* diretorio2
. Caso seja realizado cp -r diretorio1 diretorio2
, com diretorio2 existente, será copiado
O comando mv
pode ser utilizado tanto para mover arquivos quanto para renomeá-los. A sintaxe é bastante semelhante ao cp
, mas não é necessário a opção -r
para mover um diretório para dentro de outro. Seguem alguns casos de uso:
Renomear um arquivo ou diretório: mv arquivo novonome
. Note que novonome
não deve existir, ou poderá ocorrer uma sobrescrita de arquivos (caso arquivo
e novonome
for um arquivo) ou mover arquivo
para o diretório novonome(
caso novonome
for um diretório).
Mover um ou mais arquivos para dentro de um diretório: mv arq1 arq2 arq3 diretoriodestino
Mover um diretório para dentro de outro, já existente: mv dir1 diretoriodestino
Há dois comandos principais para encontrar a localização de comandos no sistema operacional: which
e whereis
. A diferença principal entre esses dois comandos é que o which
irá procurar apenas pela localização do comando, enquanto que o whereis
também retorna a localização do source code (se houver) e dos manuais.
Ambos são úteis em scripts para descobrir se determinado sistema contém um binário essencial para a execução de certa parte do script - como uma checagem de dependências.
Na imagem abaixo estão os outputs desses dois comandos.
Porém, se pesquisarmos por comandos básicos, como o cd
ou o exit
, não é retornado nada - ou, no máximo, os manuais/source. Para entendermos o que está acontecendo, teremos que internalizar o conceito de tipos de comandos.
Em um shell, como o bash, os comandos podem ser divididos em dois tipos:
São comandos integrados ao shell em si e não residentes no filesystem como binários, como o cd
e o exit
. Devido a essa integração, não residem como binários no filesystem e não podem ser encontrados com which
e whereis
. Suas funcionalidades são primordiais para o funcionamento da shell e da sua linguagem de script.
Como estão integrados ao shell executado, a sua compatibilidade depende inteiramente dele - ou seja, um comando pode estar disponível no bash e não no sh, ou até mesmo estar disponível mas necessitar de outros parâmetros ou sintaxe.
A maior parte dos comandos builtin podem ser encontrados lendo o manual do bash ou digitando o comando help
, sem parâmetros.
São comandos externos, disponíveis no filesystem, compilados e podem ser executados por outras aplicações diretamente. Logo, eles podem ser encontrados pelos comandos which
e whereis
. Sua compatibilidade depende do sistema e não da shell. Alguns exemplos são o ls
, man
, mkdir
e touch
.