Entradas e saídas Padrão no Shell PDF Imprimir E-mail
Escrito por Prof. Carlos A. Maziero   
Ter, 25 de Janeiro de 2011 01:09

A maioria dos comandos UNIX pode comunicar-se com o sistema através de descritores de arquivos especiais conhecidos como entradas e saídas padrão. Eles são:

Entrada padrão (stdin - standard input): onde o comando vai ler seus dados de entrada. No Bash, esse arquivo é referenciado pelo descritor 0.

Saída padrão (stdout - standard output): onde o comando vai escrever seus dados de saída. No Bash, esse arquivo é referenciado pelo descritor 1.

Saída de erro (stderr - standard error): onde o comando vai enviar mensagens de erro. No Bash, esse arquivo é referenciado pelo descritor 2.

Quando um comando é lançado sem indicar seu arquivo de trabalho, ele busca seus dados da entrada padrão. Por default, o shell onde o comando foi lançado associa o processo ao seu terminal, ou seja: a entrada padrão do processo é associada ao teclado e as saídas padrão e de erros à tela da sessão corrente.

Um exemplo de uso da entrada e saída padrão é o comando rev, que escreve em sua saída padrão as linhas de texto lidas em sua entrada padrão, invertendo-as:

~> rev
vamos fazer um teste
etset mu rezaf somav
temos que achar um palindromo
omordnilap mu rahca euq somet
opoetaamaateopo
opoetaamaateopo
^D
~>


No exemplo, as linhas em azul indicam as saídas geradas pelo comando rev. O caractere ^D (Control-D) no final indica o final da entrada padrão (ou seja, o fim de arquivo). Ao receber esse caractere, o comando rev encerra sua execução, pois chegou ao final de seu arquivo de entrada (que neste caso é o teclado). Outro exemplo de uso da entrada e saída padrão é comando sort:

~> sort
joao
maria
antonio
carlos
manoel
^D
antonio carlos joao manoel maria
~>


Normalmente o shell direciona a entrada padrão para o teclado e a saída padrão para a tela da sessão do usuário, mas ele pode ser instruído para redirecioná-las para arquivos ou mesmo para outros programas, como será visto na seqüência.
Redireção para arquivos

O shell pode redirecionar as entrada e saídas padrão de comandos para arquivos normais no disco, usando operadores de redireção, como mostra a figura abaixo:

A sintaxe de redireção é específica para cada shell, isto é, não é a mesma entre o C-Shell e o Bourne Shell; aqui será apresentada a sintaxe do shell Bash. Os principais operadores de redireção para arquivos são:

Saída em arquivo: a saída padrão (stdout) do comando é desviada para um arquivo usando o operador >:

~> ls > listagem.txt


Entrada de arquivo: a entrada padrão (stdin) pode ser obtida a partir de um arquivo usando o operador <:

~> rev < listagem.txt


Uso combinado: os dois operadores podem ser usados simultaneamente.

~> rev < listagem.txt > listrev.txt


Concatenação: a saída padrão pode ser concatenada a um arquivo existente usando-se o operador », como mostra o exemplo:

~> ls /etc >> listagem.txt


Saída de erros: a saída de erros (stderr) também pode ser redirecionada, através do operador 2> (que faz referência ao descritor 2):

~> ls /xpto > teste.txt
ls: /xpto: No such file or directory
~> ll /xpto 2> erro.txt
~> cat error.txt
ls: /xpto: No such file or directory


As saídas padrão e de erro podem ser redirecionadas de forma independente:

~> ll /xpto /etc/passwd > acerto.txt 2> erro.txt
~> cat error.txt
ls: /xpto: No such file or directory
~> cat acerto.txt
-rw-r--r-- 1 root root 2136 Mai 14 17:02 /etc/passwd


Além disso, a saída de erro pode ser sobreposta à saída padrão:


~> ll /xpto /etc/passwd > acerto.txt 2>&1
~> cat acerto.txt
-rw-r--r-- 1 root root 2136 Mai 14 17:02 /etc/passwd ls: /xpto: No such file or directory

Forçar um desvio: Caso a saída seja redirecionada para um arquivo já existente, o shell recusa a operação indicando o erro (somente se a variável noclobber estiver setada através do comando set -C). Essa operação pode ser forçada através do operador !:


~> ls > teste.txt
teste.txt: File exists.
~> ls >! teste.txt
~> ls >> novo.txt
novo.txt: No such file or directory
 ~> ls >>! novo.txt


Atenção: a sintaxe dos operadores de redireção depende do tipo de shell. Isso significa que a sintaxe de redireção do Bash e do C-Shell, embora similares, são diferentes. A sintaxe apresentada aqui corresponde ao shell Bash.
Redireção usando pipes

O shell permite a construção de comandos complexos através da combinação de vários comandos simples. O operador |, conhecido como pipe, ou tubo, permite conectar a saída padrão de um comando à entrada padrão de outro. Com isso, um mesmo fluxo de dados pode ser tratado por diversos comandos consecutivamente, como mostra a figura:


É importante ressaltar que os comandos conectados são lançados simultaneamente pelo shell e executam ao mesmo tempo. O shell controla a execução de cada um para que não haja acumulo de dados entre os comandos (a cada pipe é associado um buffer de tamanho limitado).

A sintaxe usada para redireção é simples. Eis alguns exemplos:

~> ls -l /etc | more
~> ls -l /tmp | sort | more
~> ls -l /usr/bin | cut -c31-40 | sort | more

Filtros

Existe um grande número de comandos UNIX bastante simples, cujo uso direto é pouco útil, mas que podem ser de grande valia quando associados entre si através de pipes. Esses comandos são chamados filtros, porque funcionam como filtros para o fluxo de dados. Eis alguns filtros de uso corrente:

  • cat : concatena diversos arquivos na saída padrão
  • tac : idem, mas inverte a ordem das linhas
  • more : permite a paginação do fluxo de dados
  • tr : troca de caracteres entre dois conjuntos
  • head : seleciona as n linhas iniciais do fluxo de dados
  • tail : seleciona as n linhas finais do fluxo de dados
  • wc : conta o número de linhas, palavras e bytes do fluxo
  • sort : ordena as linhas segundo critérios ajustáveis
  • uniq : remove linhas repetidas, deixando uma só linha
  • sed : para operações complexas de strings (trocas, etc)
  • grep : seleciona linhas contendo uma determinada expressão
  • cut : seleciona colunas do fluxo de entrada
  • rev : reverte a ordem dos caracteres de cada linha do fluxo de entrada
  • tee : duplica o fluxo de entrada (para um arquivo e para a saída standard)


: qualquer programa que leia dados de stdin e escreva sua saída em stdout pode ser usado como filtro

Para conhecer melhor cada um dos comandos acima, basta consultar suas respectivas páginas de manual.

Exercícios

   1. Determine o número de linhas da página de manual do shell Bash.
   2. Determine quanto arquivos normais (não diretórios nem links) existem em /usr.
   3. Monte uma linha de comandos usando pipes para identificar todos os usuários proprietários de arquivos ou diretórios a partir de /tmp, colocando o resultado no arquivo users-tmp.txt. Siga os seguintes passos:
     

Use o comando find para listar os proprietários de todos os arquivos dentro de /tmp (dica: use a opção -printf do comando find).


  • Ordene a listagem obtida, usando o comando sort
  • Remova as linhas repetidas, usando o comando uniq
  • Direcione a saída para o arquivo indicado users-tmp.txt.


4.O arquivo /var/log/secure contém um registro de conexões de usuários ao servidor. Monte uma linha de comandos usando pipes para gerar uma listagem constando quantas vezes cada usuário se logou via SSH (shell seguro) no servidor durante este mês, ordenada por número de acessos, e armazene o resultado no arquivo users-ssh.txt. Siga os seguintes passos:
  

  • Selecione as linhas referentes ao mês corrente no arquivo de log.
  • Identifique e selecione as linhas referentes a inícios de conexões SSH.
  • Recorte as colunas referentes aos nomes dos usuários.
  • Ordene a lista de nomes de usuários.
  • Remova as linhas repetidas, contando as repetições.
  • Ordene a lista obtida por número de acessos.
  • Desvie a saída para o arquivo desejado.





Última atualização em Ter, 25 de Janeiro de 2011 01:26
 

Adicionar comentário


Código de segurança
Atualizar