Luciano Siqueira

lcnsqr.com



Tópico 2: Localizar-se num Sistema Linux

Peso: 9

2.1: O Básico da Linha de Comando

Peso: 3

A maneira tradicional de interagir com um computador com Linux ‒ especialmente um servidor de rede ‒ é usando a linha de comando. A linha de comando apresenta o prompt do shell indicando que o sistema está pronto para receber instruções. Normalmente, o prompt terminado com o caractere $ indica que é um usuário comum que está utilizando o sistema. Quando terminado com o caractere #, indica tratar-se do usuário root.

O usuário root

O usuário root pode realizar todo tipo de operações no sistema. Por questões de segurança e privacidade, toda tarefa e arquivo têm um usuário “dono”. Cada usuário pode interferir apenas nas tarefas e arquivos que lhe pertencem. Já o usuário root pode interferir em qualquer tarefa ou arquivo.

A linha de comando é aberta com um programa chamado emulador de terminal. Normalmente, é chamado apenas de terminal no menu de aplicativos.

O shell Bash

No ambiente de linha de comando, o shell é o programa que faz a intermediação entre o usuário e os recursos do computador, como se fosse um ambiente de programação em tempo real para executar tarefas. O shell padrão na maioria das distribuições Linux é o Bash (Bourne Again Shell), ao qual os procedimentos aqui apresentados referem-se.

Um comando do shell pode consistir somente no nome do programa que se quer executar. Além daqueles oferecidos pelos demais programas instalados no computador, estão disponíveis diversos comandos embutidos do shell. Um dos comandos embutidos mais simples é o echo, que simplesmente exibe um conteúdo na tela:

$ echo Linux Essentials
Linux Essentials

O sinal $ é mostrado apenas para indicar o prompt do shell, não deve ser digitado. Após escrever o comando echo Linux Essentials, o comando deve ser enviado pressionando a tecla Enter. A resposta do comando será exibida logo abaixo do comando. Para evitar que o comando echo quebre a linha (coloque o prompt na linha de baixo) no final da saída, utiliza-se echo -n Linux Essentials. Para que o comando echo utilize caracteres especiais, deve ser informada a opção -e. Por exemplo, para criar uma quebra de linhas entre as duas palavras:

$ echo -e "Linux\nEssentials"
Linux
Essentials

O termo \n representa uma quebra de linha.

Alguns comandos podem usar tantas opções e argumentos que chegam a ocupar mais de uma linha. Para quebrar um comando em mais de uma linha, se utiliza o sinal \ (barra invertida) antes de cada quebra de linha. Por exemplo, para quebrar o comando find /usr/share/doc -ipath '*howto*' -type d -ctime -100 -exec ls -ld '{}' ';' em duas linhas:

$ find /usr/share/doc -ipath '*howto*' -type d \
-ctime -100 -exec ls -ld '{}' ';'

O comando find é utilizado para localizar arquivos no sistema de arquivos e é um exemplo de programa que pode receber muitos argumentos e opções. Um argumento ou parâmetro de comando é um termo esperado pelo programa para realizar a ação desejada. No exemplo anterior, foi utilizado o argumento /usr/share/doc para indicar onde o find deveria iniciar a busca.

Uma opção de comando é uma letra ou palavra, normalmente precedida de um traço, que modifica o comportamento de um comando. No exemplo anterior, duas opções utilizadas foram -ipath '*howto*" e -type d, que indicam alguns filtros do find.

O esperado para a maioria dos comandos é que produzam a saída com o resultado imediatamente após o pressionamento da tecla Enter. Dependendo das circunstâncias, a saída do comando pode demorar mais que o esperado. Caso um programa esteja demorando muito para terminar ou não se quer esperar sua conclusão por qualquer outro motivo, pressionar a combinação de teclas Ctrl + c fará com que o programa seja interrompido e o prompt do shell fique novamente disponível.

Variáveis

As variáveis usadas no shell são semelhantes às usadas em linguagens de programação. Uma variável é um nome que guarda um valor, que pode ser letras ou números. Nomes de variáveis são limitados a caracteres alfanuméricos, ou seja, pode conter letras e números, mas deve sempre começar com uma letra. A atribuição de um valor para uma variável é feito com o sinal de igual, onde o nome da variável fica a esquerda e o conteúdo da variável fica a direita:

$ lpi="Linux Professional Institute"

Não devem haver espaços antes ou depois do sinal de igual. Se houverem espaços no conteúdo da variável, é importante utilizar as aspas duplas ou simples para não confundir o shell. O valor de uma variável pode ser exibido colocando o sinal $ à frente do nome:

$ echo $lpi
Linux Professional Institute

Variáveis podem ser criadas por usuários comuns ou pré-definidas pelo sistema operacional. Tanto as variáveis pré-definidas quanto variáveis definidas para a sessão atual podem ser utilizadas por programas para obter configurações importantes do sistema. Quando definidas numa sessão interativa do shell, as variáveis também são chamadas de variáveis de ambiente. O próprio shell utiliza variáveis de ambiente para definir diversas de suas configurações.

O shell interpreta a primeira palavra fornecida como um comando interno ou o nome de um programa. A localização para o programa precisa ser fornecida, a menos que este esteja localizado em um dos diretórios contidos na variável global PATH. Se o programa está no diretório atual e fora dos diretórios contidos em PATH, seu nome deve ser precedido por ./, por exemplo ./script.sh.

O conteúdo da variável PATH pode ser exibido com o comando echo:

$ echo $PATH
/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Caso o programa ou script esteja em um diretório que não consta na variável PATH, o usuário pode incluí-lo para seu uso próprio temporariamente, até o fim da sessão do shell. Isso evita a necessidade de especificar o caminho para o programa, como no caso do ./ em ./script.sh, ou um caminho mais longo. Caso o programa esteja no diretório atual, primeiro pode ser utilizado o comando pwd para obter o caminho do diretório atual por extenso:

$ pwd
/home/luciano

O caminho /home/luciano pode ser incluído na variável PATH com o comando export:

$ export PATH=/home/luciano:$PATH

Dessa forma, até o fim da sessão atual do shell, a variável PATH terá um novo diretório:

$ echo $PATH
/home/luciano:/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Essa ação costuma ser necessária somente se o usuário escreve os próprios programas. Por padrão, todos os programas ficam nos diretórios originais definidos na variável PATH. A localização específica de um comando pode ser determinada com outro comando, which:

$ which man
/usr/bin/man

Outra maneira de determinar a localização de um comando no sistema de arquivos é utilizar o comando type:

$ type man
man é /usr/bin/man

Caso o comando informado seja um comando interno do Bash, a saída produzida pelo type será diferente:

$ type echo
echo é um comando interno do shell

No caso do programa man, o Bash foi capaz de identificar sua localização pois o diretório /usr/bin consta na variável PATH.

Todas as variáveis globais são escritas em letras maiúsculas. Em ambientes Unix, há diferença entre letras maiúsculas e minúsculas. Portanto, utilizar Path ou path não irá funcionar. As variáveis globais são criadas no carregamento do sistema e exportadas com o comando export para que estejam disponíveis em todas as sessões futuras do shell.

Existem diversas outras variáveis globais definidas ao iniciar o shell que podem orientar o comportamento dos programas. A variável HISTFILE, por exemplo, armazena o caminho para o histórico de comandos digitados. Por padrão, o histórico é armazenado no arquivo .bash_history, no diretório pessoal do usuário. O histórico é útil para recuperar comandos previamente digitados. Ao pressionar a seta para cima, os comandos digitados anteriormente são exibidos. Todo histórico de comandos é exibido com o comando history.

Substituição de comandos

A saída de um comando pode ser armazenada dentro de uma variável, usando as aspas invertidas:

$ agora=`date`

O comando date exibe a data e a hora do sistema. Nesse caso, a data e a hora foram armazenadas na variável agora, cujo conteúdo pode ser exibido com o comando echo:

$ echo $agora
seg fev 25 21:38:15 -03 2019

É possível também usar a saída de um comando como argumento para outro, usando aspas invertidas:

$ echo "A data atual é `date`"
A data atual é seg fev 25 21:38:54 -03 2019

Alternativamente, pode ser usado o formato $() no lugar das aspas simples. O mesmo resultado dos exemplos anteriores seria obtido com $(date) no lugar de `date`.

Englobamento

As operações com arquivos e diretórios permitem o uso de caracteres curinga, que são padrões de substituição de caracteres. O caractere * substitui qualquer sequência de caracteres:

$ ls /etc/host*
/etc/host.conf  /etc/hostname  /etc/hosts  /etc/hosts.allow  /etc/hosts.deny

O caractere ? substitui apenas um caractere:

$ ls /dev/sda?
/dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4

O uso de colchetes permite indicar uma lista de caracteres:

$ ls /dev/hd[abc]
/dev/hda /dev/hdb /dev/hdc

Chaves indicam uma lista de termos separados por vírgula:

$ ls /dev/{hda,fdO}
/dev/fdO /dev/hda

O uso de exclamação antes de um curinga o exclui da operação:

ls /dev/tty[!56789]
/dev/tty0  /dev/tty1  /dev/tty2  /dev/tty3  /dev/tty4

Curingas precedidos de barra invertida (\) não realizam substituição. São denominados caracteres escapados. Entre aspas duplas, apenas os caracteres especiais (`) e $ têm efeito. Entre aspas simples, nenhum caractere especial tem efeito.

Comandos sequenciais

A grande maioria das tarefas depende da execução de mais de um comando. Para executar três comandos em sequência, independente do resultado de cada um, utiliza-se o formato:

comando1 ; comando2 ; comando3

Executar o comando seguinte apenas se o anterior foi bem sucedido (se retornou 0):

comando1 && comando2 && comando3

Executar o comando seguinte apenas se o anterior não foi bem sucedido (se retornou diferente de 0):

comando1 || comando2 || comando3

Todos os comandos obedecem à essas formas padronizadas de utilização. No entanto, cada comando possui uma finalidade e opções diferentes, sendo necessário consultar a sua documentação para conhecer detalhadamente sua utilização.

2.2: Utilizando a Linha de Comando para Obter Ajuda

Peso: 2

Em função do grande número de comandos disponíveis no ambiente Linux, é bastante difícil memorizar a finalidade de todos os comandos e opções. Para facilitar a digitação de um comando ou de um caminho existente, o shell oferece o recurso de autocompletar, acionado com a tecla [TAB]. Após digitar as primeiras letras de um comando ou caminho de diretório, a tecla [TAB] completa a linha de acordo com os comandos e caminhos encontrados.

Muitas das dúvidas a respeito da utilização de um comando podem ser sanadas ao fornecer a opção --help ao próprio comando. Contudo, a fonte de informação mais completa sobre um programa encontra-se em seu manual. Praticamente todos os comandos e arquivos de configuração no Linux acompanham um manual. Esse manual está acessível por intermédio do comando man, que demonstra em detalhes as funções do item em questão. Para ver um manual, basta usar o comando man, tendo o comando ou arquivo como argumento.

O comando info

O comando info é uma espécie de alternativa aos manuais man. Além do comando man, pode haver documentação disponível pelo info. Em geral, informações disponíveis em páginas info também estão disponíveis em páginas de manual, porém de forma menos detalhada. Por padrão, os arquivos desse tipo de documentação são armazenadas em /usr/share/info.

Em sua maioria, os manuais têm a seguinte organização:

A navegação dentro do manual pode ser feita com as setas do teclado e com as teclas Page Up e Page Down. Também é possível fazer uma busca textual ao pressionar a tecla / (barra), que abre um campo na parte de baixo do terminal para digitar o termo a ser buscado. A busca é então realizada ao pressionar Enter. Para localizar a próxima ocorrência, basta pressionar a tecla n. Para encontrar a ocorrência anterior, basta pressionar a tecla ?. Pressionar a tecla q finalizar o leitor do manual e retorna para o prompt do shell.

Procurar por manuais

É possível buscar ocorrências de um termo na seção nome dos manuais com o comando apropos. Esse comando retorna a uma descrição breve para cada ocorrência encontrada e o nome do respectivo comando ou arquivo.

Uma maneira de localizar os manuais de referência para um determinado programa é usar o comando whatis. O banco de dados do comando whatis armazena a seção nome dos manuais do sistema. O banco de dados geralmente é atualizado por um agendamento de sistema. Para cada recurso de manual localizado, o whatis mostra uma breve descrição:

$ whatis man
man (1)              - an interface to the on-line reference manuals
man (7)              - macros to format man pages

Os números entre parênteses referem-se à seção a qual pertence o manual. As seções existentes são listadas a seguir:

Para acessar um item em uma seção específica, o número da seção precede o nome do item. Por exemplo, acessar o manual de printf na seção número 3:

man 3 printf

Por padrão, os arquivos dos manuais são armazenadas em /usr/man e /usr/share/man, em subdiretórios correspondentes à cada seção. Outros locais podem ser especificados com a variável MANPATH.

O comando whereis pode ser utilizado para localizar o arquivo do manual. Além disso, ele exibe o diretório onde está o comando e, se houver, o código fonte:

$ whereis find
find: /usr/bin/find /usr/bin/X11/find /usr/share/man/man1/find.1.gz

Para localizar arquivos e diretórios em geral, pode ser utilizado o comando locate. Um nome ou parte do caminho é fornecido como argumento, que exibirá todas as ocorrências correspondentes.

Outras documentações

Projetos GNU geralmente incluem documentação como guias e exemplos de utilização. Esses documentos não têm um formato universal, mas podem ser oferecidos em texto puro, documentos HTML ou PDF. Estes arquivos podem ser encontrados em /usr/share/doc, em diretórios correspondentes aos programas.

2.3: Utilizando Diretórios e Listando Arquivos

Peso: 2

À exceção do usuário administrador root, cujo diretório é /root, o diretório inicial é o diretório pessoal do usuário, localizado em /home, que leva o nome do usuário (utilizado para entrar no sistema). Para mudar de diretório, é utilizado o comando cd, seguido do caminho absoluto ou relativo para o diretório desejado.

Os caminhos para diretórios e arquivos podem ser acessados tanto por seu caminho absoluto quanto pelo relativo. Caminhos absolutos são aqueles iniciados pela barra da raiz (/) e caminhos relativos são aqueles que tomam por referência o diretório atual. O ponto (.) refere-se ao diretório atual, e os dois pontos (..) referem-se ao diretório que contém o diretório atual.

Sem argumentos, o comando cd leva para o diretório pessoal do usuário. Outra maneira de indicar o diretório pessoal é utilizar o sinal ~. Este pode ser utilizado, por exemplo, para ir até um diretório no diretório pessoal, cd ~/Documentos, ou para indicar um arquivo no diretório pessoal, ls ~/Documentos/doc.txt.

O comando ls é usado para listar arquivos e conteúdo de um diretório. A opção -l exibe detalhes sobre o(s) arquivo(s), -s mostra o tamanho em bytes e -d mostra as propriedades de um diretório, não seu conteúdo. Exemplo de saída de ls -l:

$ ls -l /
total 64
lrwxrwxrwx    1 root root     7 fev  7  2018 bin -> usr/bin
dr-xr-xr-x.   7 root root  4096 fev 26 10:06 boot
drwxr-xr-x   20 root root  4300 fev 26 10:10 dev
drwxr-xr-x. 194 root root 12288 fev 26 10:10 etc
drwxr-xr-x.   4 root root  4096 fev  7  2018 home
lrwxrwxrwx    1 root root     7 fev  7  2018 lib -> usr/lib
lrwxrwxrwx    1 root root     9 fev  7  2018 lib64 -> usr/lib64
drwx------    2 root root 16384 nov 15  2016 lost+found
drwxr-xr-x.   2 root root  4096 fev  7  2018 media
drwxr-xr-x.   2 root root  4096 set 18 00:04 mnt
drwxr-xr-x.   4 root root  4096 fev  7  2018 opt
dr-xr-xr-x  209 root root     0 fev 26 10:08 proc
dr-xr-x---.  27 root root  4096 fev 26 10:53 root
drwxr-xr-x   53 root root  1560 fev 26 11:08 run
lrwxrwxrwx    1 root root     8 fev  7  2018 sbin -> usr/sbin
drwxr-xr-x.   2 root root  4096 fev  7  2018 srv
dr-xr-xr-x   13 root root     0 fev 26 10:10 sys
drwxrwxrwt   14 root root   320 fev 26 12:13 tmp
drwxr-xr-x.  14 root root  4096 ago 28 08:41 usr
drwxr-xr-x.  26 root root  4096 ago 30 12:43 var

Diversas informações são exibidas à esquerda do nome de cada item, como as permissões de acesso, o usuário dono do arquivo e a data de modificação.

Arquivos que começam com um ponto “.” não são exibidos pelo comando ls. Para que esses arquivos também sejam exibidos, é necessário utilizar o ls com a opção -a. Também é possível utilizar englobamento nas listagens. Por exemplo, para listar todos os arquivos que terminem com o sufixo .txt, utiliza-se ls *.txt.

Para obter uma lista com os conteúdos de todos os subdiretórios, pode ser utilizado o comando ls -R ou o comando find. O principal comando de localização de arquivos em linha de comando é o find, cuja sintaxe básica é find diretório critério.

O argumento diretório indica onde o find deve iniciar a busca, e o critério pode ser o nome do arquivo ou diretório a ser procurado ou uma regra para a busca. Existem dezenas de critérios de busca, os mais comuns são:

O find pode ser utilizado, por exemplo, para obter uma lista com todos os arquivos criados no diretório pessoal ou em seus subdiretórios nas últimas 24 horas:

$ find /usr/lib -type f -ctime -1

A opção -find f determina que sejam buscados somente arquivos (excluindo diretórios e outros arquivos especiais) e a opção -ctime -1 determina que a data de criação dos arquivos seja inferior a 1 dia em relação a data atual.

2.4: Criar, mover e apagar arquivos

Peso: 2

O comando cp é utilizado para copiar arquivos. Suas opções principais são:

É importante saber que ao copiar um diretório recursivamente, a presença do * no final do diretório de origem fará com que apenas o conteúdo do diretório seja copiado para o destino; não usar o * fará com que o diretório de origem e seu conteúdo sejam copiados no destino.

O comando mv move e renomeia arquivos e diretórios. Usado com a opção -i, ele pede confirmação antes de sobrescrever um arquivo de destino.

Um arquivo vazio pode ser criado com o comando touch. Por exemplo, touch arquivo.txt cria o arquivo vazio arquivo.txt. O comando touch também pode ser utilizado apenas para alterar a data de um arquivo. Usado sem argumentos, touch altera a data e a hora de criação e modificação de um arquivo para os valores atuais do sistema. Para alterar apenas a data de modificação, usa-se a opção -m, e para alterar apenas a data de acesso, usa-se a opção -a. Outros valores de tempo podem ser passados com a opção -t.

O comando mkdir cria diretórios. Para criar uma árvore de diretórios recursivamente, sem necessidade de criar um a um, usa-se a opção -p:

mkdir -p caminho/completo/para/diretório

Para alterar as permissões do diretório no ato da criação, as mesmas são transmitidas ao mkdir com a opção -m. Diretórios vazios podem ser apagados pelo comando rmdir. Com a opção -p, o rmdir remove o diretório indicado e os diretórios superiores, desde que estejam vazios.

Para apagar um arquivo, o comando é rm. Para apagar diretórios com conteúdo, usa-se rm -r. Para forçar a remoção, a opção -f é utilizada.