Unix / Linux - Redirecionamentos de entrada / saída de shell

Neste capítulo, discutiremos em detalhes sobre os redirecionamentos de entrada / saída do Shell. A maioria dos comandos do sistema Unix recebem entrada de seu terminal e enviam a saída resultante de volta para seu terminal. Um comando normalmente lê sua entrada da entrada padrão, que é o seu terminal por padrão. Da mesma forma, um comando normalmente grava sua saída na saída padrão, que é novamente seu terminal por padrão.

Redirecionamento de saída

A saída de um comando normalmente destinado à saída padrão pode ser facilmente desviada para um arquivo. Esse recurso é conhecido como redirecionamento de saída.

Se a notação> arquivo for anexada a qualquer comando que normalmente grava sua saída na saída padrão, a saída desse comando será gravada no arquivo em vez de em seu terminal.

Verifique o seguinte who comando que redireciona a saída completa do comando no arquivo de usuários.

$ who > users

Observe que nenhuma saída aparece no terminal. Isso ocorre porque a saída foi redirecionada do dispositivo de saída padrão padrão (o terminal) para o arquivo especificado. Você pode verificar o arquivo de usuários para o conteúdo completo -

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

Se um comando tiver sua saída redirecionada para um arquivo e o arquivo já contiver alguns dados, esses dados serão perdidos. Considere o seguinte exemplo -

$ echo line 1 > users
$ cat users
line 1
$

Você pode usar o operador >> para acrescentar a saída em um arquivo existente da seguinte maneira -

$ echo line 2 >> users
$ cat users
line 1
line 2
$

Redirecionamento de entrada

Assim como a saída de um comando pode ser redirecionada para um arquivo, a entrada de um comando pode ser redirecionada de um arquivo. Enquanto ogreater-than character > é usado para redirecionamento de saída, o less-than character < é usado para redirecionar a entrada de um comando.

Os comandos que normalmente obtêm sua entrada da entrada padrão podem ter sua entrada redirecionada de um arquivo dessa maneira. Por exemplo, para contar o número de linhas no arquivo gerado pelos usuários acima, você pode executar o comando da seguinte maneira -

$ wc -l users
2 users
$

Após a execução, você receberá a seguinte saída. Você pode contar o número de linhas no arquivo redirecionando a entrada padrão dowccomando dos usuários do arquivo -

$ wc -l < users
2
$

Observe que há uma diferença na saída produzida pelas duas formas do comando wc. No primeiro caso, o nome dos usuários do arquivo é listado com a contagem de linhas; no segundo caso, não.

No primeiro caso, wc sabe que está lendo sua entrada dos usuários do arquivo. No segundo caso, ele apenas sabe que está lendo sua entrada da entrada padrão, portanto, não exibe o nome do arquivo.

Aqui Documento

UMA here document é usado para redirecionar a entrada para um script ou programa de shell interativo.

Podemos executar um programa interativo dentro de um script de shell sem ação do usuário, fornecendo a entrada necessária para o programa interativo, ou script de shell interativo.

A forma geral de um here documento é -

command << delimiter
document
delimiter

Aqui, o shell interpreta o <<operador como uma instrução para ler a entrada até encontrar uma linha contendo o delimitador especificado. Todas as linhas de entrada até a linha que contém o delimitador são alimentadas na entrada padrão do comando.

O delimitador diz ao shell que o heredocumento foi concluído. Sem ele, o shell continua a ler a entrada para sempre. O delimitador deve ser uma única palavra que não contenha espaços ou tabulações.

A seguir está a entrada para o comando wc -l para contar o número total de linhas -

$wc -l << EOF
   This is a simple lookup program 
	for good (and bad) restaurants
	in Cape Town.
EOF
3
$

Você pode usar o here document para imprimir várias linhas usando seu script da seguinte maneira -

#!/bin/sh

cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

Após a execução, você receberá o seguinte resultado -

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

O seguinte script executa uma sessão com o vi editor de texto e salva a entrada no arquivo test.txt.

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

Se você executar este script com o vim agindo como vi, provavelmente verá uma saída como a seguinte -

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

Depois de executar o script, você deve ver o seguinte adicionado ao arquivo test.txt -

$ cat test.txt
This file was created automatically from
a shell script
$

Descartar a saída

Às vezes, você precisará executar um comando, mas não deseja que a saída seja exibida na tela. Nesses casos, você pode descartar a saída redirecionando-a para o arquivo/dev/null -

$ command > /dev/null

Aqui, comando é o nome do comando que você deseja executar. O arquivo/dev/null é um arquivo especial que descarta automaticamente todas as suas entradas.

Para descartar a saída de um comando e sua saída de erro, use o redirecionamento padrão para redirecionar STDERR para STDOUT -

$ command > /dev/null 2>&1

Aqui 2 representa STDERR e 1 representa STDOUT. Você pode exibir uma mensagem em STDERR redirecionando STDOUT para STDERR da seguinte forma -

$ echo message 1>&2

Comandos de redirecionamento

A seguir está uma lista completa de comandos que você pode usar para redirecionamento -

Sr. Não. Comando e Descrição
1

pgm > file

A saída do pgm é redirecionada para o arquivo

2

pgm < file

O programa pgm lê a entrada do arquivo

3

pgm >> file

A saída do pgm é anexada ao arquivo

4

n > file

Saída do fluxo com descritor n redirecionado para o arquivo

5

n >> file

Saída do fluxo com descritor n anexado ao arquivo

6

n >& m

Mescla a saída do fluxo n com fluxo m

7

n <& m

Mescla a entrada do fluxo n com fluxo m

8

<< tag

A entrada padrão vem daqui até a próxima tag no início da linha

9

|

Pega a saída de um programa ou processo e a envia para outro

Observe que o descritor de arquivo 0 normalmente é a entrada padrão (STDIN), 1 é a saída padrão (STDOUT), e 2 é a saída de erro padrão (STDERR).