Capítulo 3. Trabalhando com o Shell

Sumário

3.1. Noções básicas sobre o shell Bash
3.2. Usuários e permissões de acesso
3.3. Comandos importantes do Linux
3.4. Editor vi

Resumo

Ao inicializar o sistema Linux, você é, em geral, direcionado a uma interface gráfica de usuário que o orienta no processo de login e nas interações seguintes com o sistema. Embora as interfaces gráficas de usuário tenham aumentado sua importância e facilidade de uso, elas não são o único meio de comunicação com o sistema. Você também pode utilizar uma comunicação orientada por texto como um interpretador de linha de comando, em geral chamado de shell, onde é possível digitar comandos. Como o Linux tem opções para iniciar janelas de shell na interface gráfica do usuário, você pode usar os dois métodos facilmente.

Na administração, os aplicativos baseados em shell são principalmente importantes para controlar computadores em links de rede lentos ou para executar tarefas como root na linha de comando. Os “novatos” no Linux normalmente não digitarão comandos em um shell, mas logo perceberão que o shell não é apenas para os administradores. Na verdade, o uso do shell é em geral o meio mais rápido e fácil de realizar algumas tarefas diárias.

Existem vários shells para UNIX ou Linux. O shell padrão do SUSE Linux é o Bash (GNU Bourne-Again Shell).

Este capítulo trata de alguns fundamentos sobre o uso do shell. Estão incluídos os seguintes tópicos: como digitar comandos, a estrutura de diretórios do Linux, como trabalhar com arquivos e diretórios e usar algumas funções básicas, o conceito de usuário e permissão do Linux, uma visão geral de importantes comandos do shell, e uma rápida introdução sobre o editor vi, que é o editor padrão sempre disponível em sistemas Unix e Linux.


3.1. Noções básicas sobre o shell Bash

No Linux, é possível usar a linha de comando paralelamente à interface gráfica de usuário e alternar entre as duas. Para iniciar uma janela de terminal na interface gráfica de usuário no KDE, clique no ícone Konsole no painel. No GNOME, clique no ícone Terminal GNOME no painel.

O Konsole ou a janela Terminal GNOME é exibida com o prompt na primeira linha como na Figura 3.1, “Exemplo de uma janela de terminal do Bash”. Em geral, o prompt mostra seu nome de login (neste exemplo, tux), o nome de host do computador (aqui é knox) e o caminho atual (neste caso, seu diretório pessoal, como indicado pelo til, ~). Quando você efetua login em um computador remoto, essas informações sempre se referem ao sistema no qual você está trabalhando. Quando o cursor está depois desse prompt, você pode enviar comandos diretamente ao seu sistema de computador.

Figura 3.1. Exemplo de uma janela de terminal do Bash

Exemplo de uma janela de terminal do Bash

3.1.1. Digitando comandos

Um comando é composto de vários elementos. O primeiro elemento é sempre o comando real, seguido por parâmetros e opções. Você pode digitar um comando e editá-lo usando , , <—, Del e Space. Além de adicionar opções ou corrigir erros de digitação. O comando é executado quando você pressiona Enter.

[Important]Ausência de mensagens é um bom sinal

O shell não é verboso: ao contrário de algumas interfaces gráficas de usuário, ele não costuma fornecer mensagens de confirmação depois que os comandos são executados. As mensagens só aparecem quando há problemas ou erros.

Lembre-se disso também ao usar comandos para apagar objetos. Antes de digitar um comando como rm para remover um arquivo, certifique-se de realmente deseja apagar o objeto: a exclusão será irreversível.

3.1.1.1. Usando comandos sem opções

Verifique a estrutura de comandos com um simples exemplo: o comando ls, usado para listar o conteúdo de um diretório. O comando pode ser usado com ou sem opções. Digite o comando ls simples no console para ver o conteúdo do diretório atual:

Figura 3.2. Comando ls

Comando ls

Ao contrário do que ocorre no MS Windows, os arquivos no Linux podem ter uma extensão, como .txt, embora isso não seja necessário. Assim, fica difícil diferenciar arquivos e pastas na saída do ls. Por padrão, as cores funcionam como dicas: em geral, os diretórios aparecem em azul e os arquivos em preto.

3.1.1.2. Usando comandos com opções

A melhor maneira de obter detalhes sobre o conteúdo de um diretório é usar o comando ls com uma string de opções. As opções modificam a maneira como um comando funciona de forma a possibilitar a execução de tarefas específicas. As opções são separadas do comando por um espaço e têm um hífen como prefixo. O comando ls -l mostra o conteúdo do mesmo diretório em detalhes (formato de listagem longa):

Figura 3.3. Comando ls -l

Comando ls -l

À esquerda do nome de cada objeto, há informações sobre o objeto em diversas colunas. As mais importantes são estas: a primeira coluna indica o tipo do objeto (no exemplo, d para diretório ou - para arquivos normais). As próximas nove colunas mostram as permissões do usuário sobre o objeto. As colunas 11 e 12 contêm o nome do proprietário e do grupo do arquivo (no caso, tux e users). Consulte informações sobre permissões do usuário e o conceito de usuário do Linux na Seção 3.2, “Usuários e permissões de acesso”. A coluna seguinte mostra o tamanho do arquivo em bytes. Depois são exibidas a data e a hora da última mudança. A última coluna contém o nome do objeto.

Para ver mais informações, você pode combinar duas opções para o comando ls e digitar ls -la. O shell mostrará também os arquivos ocultos no diretório, com um ponto na frente (por exemplo, .hiddenfile).

3.1.1.3. Obtendo ajuda

Ninguém precisa memorizar todas as opções de todos os comandos. Se você se lembrar do nome do comando mas não tiver certeza das opções, digite o comando seguido de um espaço e --help. A opção --help existe para diversos comandos. Quando você digita ls --help, todas as opções do comando ls são exibidas.

3.1.2. Estrutura de diretórios do Linux

Como o shell não oferece uma visão geral gráfica dos diretórios e arquivos como a exibição em árvore de um gerenciador, é útil ter algum conhecimento básico sobre a estrutura de diretórios padrão em um sistema Linux. Você pode considerar os diretórios como pastas eletrônicas nas quais são armazenados arquivos, programas e subdiretórios. O diretório de nível superior na hierarquia é o diretório raiz, indicado como /. É a partir dele que todos os outros diretórios podem ser acessados.

A Figura 3.4, “Exemplo de uma árvore de diretórios padrão” mostra a árvore de diretórios padrão no Linux, com os exemplos de diretórios pessoais dos usuários xyz, linux e tux. O diretório /home contém os diretórios nos quais os usuários podem armazenar seus arquivos pessoais.

[Note]Diretório pessoal em um ambiente de rede

Se você trabalha em um ambiente de rede, seu diretório pessoal talvez não seja /home. Ele pode ser mapeado para qualquer diretório do sistema de arquivos.

A lista abaixo oferece uma breve descrição dos diretórios padrão do Linux.

Figura 3.4. Exemplo de uma árvore de diretórios padrão

Exemplo de uma árvore de diretórios padrão
/

Diretório raiz, ponto inicial da árvore de diretórios

/home

Diretórios pessoais de usuários

/dev

Arquivos de dispositivos que representam componentes de hardware

/etc

Arquivos importantes para a configuração do sistema

/etc/init.d

Scripts de boot

/usr/bin

Programas genericamente acessíveis

/bin

Programas necessários anteriormente no processo de boot

/usr/bin

Programas reservados ao administrador do sistema

/sbin

Programas reservados ao administrador do sistema e necessários para inicialização

/usr/include

Arquivos de cabeçalho para o compilador C

/usr/include/g++

Arquivos de cabeçalho para o compilador C++

/usr/share/doc

Arquivos de documentação variados

/usr/share/man

Páginas do manual do sistema (páginas de manual)

/usr/src

Código-fonte do software do sistema

/usr/src/linux

Código-fonte do kernel

/tmp, /var/tmp

Arquivos temporários

/usr

Todos os programas aplicativos

/var

Arquivos de configuração (por exemplo, aqueles vinculados de /usr)

/var/log

Arquivos de registro do sistema

/var/adm

Dados do administrador do sistema

/lib

Bibliotecas compartilhadas (para programas vinculados dinamicamente)

/proc

Sistema de arquivos de processamento

/sys

Sistema de arquivos do sistema em que são reunidas todas as informações sobre dispositivos do kernel

/usr/local

Local, extensões independentes de distribuição

/opt

Software opcional, pacotes de programas complementares maiores (como KDE, GNOME e Netscape)

3.1.3. Trabalhando com diretórios e arquivos

Para acessar determinado arquivo ou diretório, é preciso especificar o respectivo caminho. Há dois meios de se especificar um caminho:

  • O caminho completo (absoluto) do diretório raiz até o respectivo arquivo

  • Um caminho que começa no diretório atual (caminho relativo)

Os caminhos absolutos sempre têm uma barra inicial. Os caminhos relativos não.

[Note]Linux diferencia maiúsculas de minúsculas

O Linux diferencia letras maiúsculas e minúsculas no sistema de arquivos. Por exemplo, test.txt ou Test.txt são diferentes no Linux. Lembre-se disso ao digitar nomes de arquivo ou caminhos.

Para mudar os diretórios, use o comando cd. Especifique o diretório a ser acessado como uma opção do comando. Faça referência ao diretório atual com um ponto (.). O próximo nível superior na árvore é representado por dois pontos (..). Para alternar para o diretório pai do diretório atual, digite cd ... Não se esqueça de incluir um espaço após o comando cd para separá-lo das opções. Agora, o prompt mostra o caminho até o pai do diretório onde você executou o comando. Para alternar para um diretório dois níveis acima, digite cd ../... ls -l ../.. lista o conteúdo desse diretório

3.1.3.1. Exemplos de como acessar um arquivo

Os comandos cd da Seção 3.1.3, “Trabalhando com diretórios e arquivos” usaram caminhos relativos. Você também pode usar caminhos absolutos. Por exemplo, suponha que você queira copiar um arquivo do seu diretório pessoal para um subdiretório de /tmp:

  1. Primeiramente, no seu diretório pessoal crie um subdiretório em /tmp:

    1. Se seu diretório atual não for o diretório pessoal, digite cd ~ para acessá-lo. De qualquer parte do sistema de arquivos, você pode ter acesso ao diretório pessoal digitando cd ~.

    2. No seu diretório pessoal, digite mkdir /tmp/test. mkdir significa “criar diretório”. Esse comando cria um novo diretório denominado test no diretório /tmp. Nesse caso, use um caminho absoluto para criar o diretório.

    3. Para verificar o que ocorreu, digite ls -l /tmp. O novo diretório test deve aparecer na lista de conteúdo do diretório /tmp.

  2. Agora crie um novo arquivo no seu diretório pessoal e use um caminho relativo para copiá-lo para o diretório /tmp/test.

    1. Digite touch myfile.txt. O comando touch com a opção myfile.txt cria um arquivo novo e vazio denominado myfile.txt no seu diretório atual.

    2. Digite ls -l para verificar se isso acontece. O novo arquivo deve constar da lista de conteúdo.

    3. Digite cp myfile.txt ../tmp/test. O arquivo myfile.txt será copiado para o diretório /tmp/test sem mudanças no nome.

    4. Digite ls -l /tmp/test para verificar se isso acontece. O arquivo myfile.txt deve aparecer na lista de conteúdo de /tmp/test.

Para listar o conteúdo dos diretórios pessoais de outros usuários, digite ls ~nomedousuário. Na árvore de diretórios do exemplo da Figura 3.4, “Exemplo de uma árvore de diretórios padrão”, um dos usuários é tux. Nesse caso, ls ~tux relacionaria o conteúdo do diretório pessoal de tux.

[Note]Trabalhando com espaços em nomes de arquivo ou diretório

Se um nome de arquivo contiver um espaço, use uma barra invertida (\) para anular o espaço ou coloque o nome do arquivo entre aspas simples ou duplas. Caso contrário, o Bash interpretará um nome de arquivo como Meus Documentos como os nomes de dois arquivos ou diretórios. A diferença entre as aspas simples e duplas é que a expansão de variáveis ocorre dentro de aspas duplas. As aspas simples garantem que o shell veja a string com aspas de forma literal.

3.1.4. Recursos úteis do shell

A digitação de comandos no Bash pode ser uma tarefa extensa. Conheça a seguir alguns recursos do Bash que podem facilitar bastante o seu trabalho e economizar tempo de digitação.

3.1.4.1. Histórico e preenchimento

Por padrão, o Bash “memoriza” os comandos digitados. Esse recurso chama-se histórico. Para repetir um comando que já tenha sido digitado, pressione até o comando anterior aparecer no prompt. Para percorrer a lista de comandos digitados anteriormente, você também pode pressionar . Você sempre tem a oportunidade de editar esse comando; por exemplo, pressionar Enter para mudar o nome de um arquivo antes de executar o comando. Para editar a linha de comando, mova o cursor até a posição desejada usando as teclas de seta e inicie a digitação. Use Ctrl-R para pesquisar o histórico.

Outro recurso útil do Bash é o preenchimento total de um nome de arquivo ou de diretório após a digitação de suas primeiras letras. Para isso, digite as primeiras letras e pressione →|. Se o nome do arquivo ou o caminho puder ser identificado de forma exclusiva, ele será preenchido assim que o cursor se aproximar do fim do nome. Você poderá digitar, então, a próxima opção do comando se necessário. Se o nome do arquivo ou o caminho não puder ser identificado com exclusividade (por existirem vários nomes de arquivo com as mesmas letras iniciais), esse nome ou caminho só será totalmente preenchido até o ponto em que houver novamente a possibilidade de diversas opções. Você pode obter uma lista delas pressionando →| mais uma vez. Depois disso, você poderá digitar as próximas letras do arquivo ou do caminho e pressionar →| para tentar preencher novamente. Após completar os nomes de arquivo e caminhos com a ajuda de →|, você poderá verificar simultaneamente se o arquivo ou o caminho a ser digitado realmente existe (e ter a certeza de estar digitando corretamente).

3.1.4.2. Curingas

Outra vantagem oferecida pelo shell são os curingas para a expansão de nomes de caminho. Curingas são caracteres que representam outros caracteres. Existem três tipos diferentes no Bash:

?

Corresponde exatamente a um caractere arbitrário.

*

Corresponde a qualquer número de caracteres

[set]

Corresponde a um dos caracteres do grupo especificado entre os colchetes, que aqui é representado pela string set. Com parte de set , você também pode especificar as classes de caractere usando a sintaxe [:classe:], onde a classe pode ser alnum, alpha, ascii etc.

Se você usar ! ou ^ no início do grupo ([!set]), haverá correspondência com um caractere diferente daqueles identificados por set.

Pressupondo-se que o diretório test contenha os arquivos Testfile, Testfile1, Testfile2 e datafile, o comando ls Testfile? listará os arquivos Testfile1 e Testfile2. Com ls Test*, a lista também incluirá Testfile. ls *fil* mostra todos os arquivos de exemplo. Por fim, você pode usar o curinga set para acessar todos os arquivos de exemplo cujo último caractere é um número: ls Testfile[1-9] ou, usando classes, ls Testfile[[:digit:]].

Dos quatro tipos de curingas, o mais inclusivo é o asterisco. Ele pode ser usado para copiar todos os arquivos contidos em um diretório para outro diretório ou apagar todos os arquivos com um único comando. O comando rm *fil*, por exemplo, apaga todos os arquivos do diretório atual cujo nome inclua a string fil.

3.1.4.3. Exibindo arquivos com os programas less (menos) e more (mais)

O Linux inclui dois programas pequenos para a exibição de arquivos de texto diretamente no shell: less (menos) e more (mais). Em vez de iniciar um editor para ler um arquivo como Readme.txt, basta digitar less Readme.txt para exibir o texto na janela de console. Use a barra de espaço para rolar uma página para baixo. Use as teclas Page Up e Page Down para mover o texto para frente ou para trás. Para sair do programa less, pressione Q.

Em vez de less, você também pode usar o programa mais antigo more. Entretanto, é menos conveniente porque ele não permite que você role para trás.

O programa less recebeu esse nome devido ao preceito de que menos é mais. Ele também pode ser usado para ver a saída de comandos de forma conveniente. Para verificar como isso funciona, leia a Seção 3.1.4.4, “Redirecionamento e pipes”.

3.1.4.4. Redirecionamento e pipes

Normalmente, a saída padrão no shell é a sua tela ou a janela de console, e a entrada padrão é o teclado. Entretanto, o shell oferece funções com as quais é possível redirecionar a entrada ou a saída para outro objeto, como um arquivo ou outro comando. Com a ajuda dos símbolos > e <, por exemplo, você pode encaminhar a saída de um comando para um arquivo (redirecionamento de saída) ou usar um arquivo como entrada para um comando (redirecionamento de entrada). Por exemplo, para gravar a saída de um comando como ls em um arquivo, digite ls -l > file.txt. É criado um arquivo denominado file.txt que contém a lista de conteúdo do seu diretório atual gerado pelo comando ls. Contudo, se já existir um arquivo chamado file.txt, o comando sobregravará o arquivo existente. Para evitar que isso aconteça, use >>. A digitação de ls -l >> file.txt apenas acrescenta a saída do comando ls a um arquivo já existente denominado file.txt. Se o arquivo não existir, ele será criado.

Há momentos em que também é útil usar um arquivo como a entrada de um comando. Por exemplo, com o comando tr, você substitui caracteres redirecionados de um arquivo e grava o resultado na saída padrão, que é a sua tela. Suponha que você queira substituir todos os caracteres t do seu arquivo file.txt do exemplo acima por x e imprimir isso na tela. Você deve digitar tr t x < file.txt.

Assim como na saída padrão, a saída de erro padrão é enviada para o console. Para redirecionar a saída de erro padrão para um arquivo chamado errors, acrescente 2> errors ao comando correspondente. A saída padrão e o erro padrão serão salvos em um arquivo chamado alloutput se você acrescentar >& alloutput.

A utilização de pipelines ou pipes também é uma espécie de redirecionamento, embora o uso do pipe não se restrinja a arquivos. Com um pipe (|), é possível combinar vários comandos, usar a saída de um comando como entrada do próximo. Por exemplo, para exibir o conteúdo ou seu diretório atual no less, digite ls | less. Isso é recomendável somente quando a saída normal com ls é muito extensa. Por exemplo, se você vir o conteúdo do diretório dev com ls /dev, apenas uma pequena parte da janela estará visível. Exiba a lista toda com ls /dev | less.

3.1.5. Pacotes e compactação de dados

Agora que você já criou vários arquivos e diretórios, pense em criar pacotes e compactar dados. Suponhamos que você queira que o diretório test inteiro seja compactado em um arquivo que possa ser salvo em um chaveiro USB como uma cópia de backup ou enviado por e-mail. Para isso, use o comando tar (para o copiador em fita). Com tar --help, exiba todas as opções do comando tar. As opções mais importantes serão explicadas aqui:

-c

(para criação) Cria um novo arquivo.

-t

(para tabela) Exibe o conteúdo de um pacote.

-x

(para extração) Descompacta o pacote.

-v

(para detalhes) Mostra na tela todos os arquivos durante a criação do pacote.

-f

(para arquivo) Escolhe um nome para o arquivo do pacote. Quando você estiver criando um pacote, esta opção deverá ser sempre a última a ser especificada.

Para compactar o diretório test com todos os respectivos arquivos e subdiretórios em um arquivo denominado testarchive.tar, use as opções -c e -f. Para fins de teste, adicione também -v para continuar com o empacotamento, embora esta opção não seja obrigatória. Depois de usar cd para ir até o seu diretório pessoal, onde está localizado o diretório test, digite tar -cvf testarchive.tar test. Em seguida, exiba o conteúdo do arquivo com tar -tf testarchive.tar. O diretório test com todos os respectivos arquivos e diretórios permaneceu inalterado no disco rígido. Para descompactar o arquivo, digite tar -xvf testarchive.tar, mas não ainda.

No caso de compactação de arquivos, a escolha óbvia é gzip ou, para uma taxa de compactação ainda melhor, bzip2. Digite apenas gzip testarchive.tar (ou bzip2 testarchive.tar, mas gzip é usado neste exemplo). Com o comando ls, observe que o arquivo testarchive.tar não existe mais e que o arquivo testarchive.tar.gz foi criado. Esse arquivo é bem menor e, portanto, mais adequado para transferência por e-mail ou armazenamento em um chaveiro USB.

Agora, descompacte o arquivo no diretório test2 criado anteriormente. Para isso, digite cp testarchive.tar.gz test2 para copiar o arquivo para esse diretório. Mude para o diretório com cd test2. Um arquivo compactado com a extensão .tar.gz pode ser descompactado com o comando gunzip. Digite gunzip testarchive.tar.gz, que resulta no arquivo testarchive.tar, e depois extraia ou descompacte o tar com o comando tar -xvf testarchive.tar. Você também pode descompactar e extrair o arquivo compactado em uma única etapa com tar -xvf testarchive.tar.gz (não é mais necessário adicionar a opção -z). Com ls, observe que um novo diretório test foi criado com o mesmo conteúdo do diretório test no seu diretório pessoal.

3.1.6. Limpando

Após este curso rápido, você deverá estar familiarizado com as noções básicas sobre a linha de comando ou o shell do Linux. Convém limpar o seu diretório pessoal. Para isso, apague os vários arquivos de teste e diretórios com os comandos rm e rmdir. Na Seção 3.3, “Comandos importantes do Linux”, localize uma lista dos comandos mais importantes e uma breve descrição de suas funções.