Redirecionamento (computação) - Redirection (computing)

Os fluxos padrão para entrada, saída e erro

Na computação , o redirecionamento é uma forma de comunicação entre processos e é uma função comum à maioria dos intérpretes de linha de comando , incluindo os vários shells Unix que podem redirecionar fluxos padrão para locais especificados pelo usuário.

Em sistemas operacionais semelhantes ao Unix, os programas fazem o redirecionamento com a chamada de sistema dup2 (2) , ou seus análogos stdio menos flexíveis, mas de nível superior , freopen (3) e popen (3) .

Redirecionando entrada e saída padrão

O redirecionamento geralmente é implementado colocando certos caracteres entre os comandos .

Básico

Normalmente, a sintaxe desses caracteres é a seguinte, usando <para redirecionar a entrada e >para redirecionar a saída. command > file1executa command1 , colocando a saída em file1 , em vez de exibi-la no terminal, que é o destino usual para a saída padrão. Isso eliminará todos os dados existentes no arquivo1 .

O uso command < file1executa command1 , com file1 como a fonte de entrada, ao contrário do teclado , que é a fonte usual de entrada padrão.

command < infile > outfilecombina os dois recursos: command1 lê do infile e grava no outfile

Variantes

Para anexar a saída para o final do arquivo, em vez de sobrepor-lo, o >>operador é usado: command1 >> file1.

Para ler de um literal de stream (um arquivo embutido, passado para a entrada padrão), pode-se usar um documento here , usando o <<operador:

$ tr a-z A-Z << END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES

Para ler uma string, pode-se usar uma string here , usando o <<<operador: ou: tr a-z A-Z <<< "one two three"

$ NUMBERS="one two three"
$ tr a-z A-Z <<< "$NUMBERS"
ONE TWO THREE

Tubulação

Um pipeline de três programas executados em um terminal de texto

Os programas podem ser executados juntos de forma que um programa leia a saída de outro sem a necessidade de um arquivo intermediário explícito. executa command1 , usando sua saída como entrada para command2 (comumente chamado de tubulação , com o caractere " " sendo conhecido como "pipe"). command1 | command2|

Os dois programas que executam os comandos podem ser executados em paralelo com o único espaço de armazenamento sendo buffers de trabalho (o Linux permite até 64K para cada buffer) mais qualquer espaço de trabalho que o processamento de cada comando requer. Por exemplo, um comando "sort" é incapaz de produzir qualquer saída até que todos os registros de entrada tenham sido lidos, já que o último registro recebido pode acabar sendo o primeiro na ordem de classificação. O sistema operacional experimental da Dra. Alexia Massalin, Synthesis , ajustava a prioridade de cada tarefa à medida que eram executadas de acordo com a plenitude de seus buffers de entrada e saída.

Isso produz o mesmo resultado final que usar dois redirecionamentos e um arquivo temporário, como em:

$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

Mas aqui, command2 não começa a ser executado até que command1 tenha terminado, e um arquivo de rascunho suficientemente grande é necessário para manter os resultados intermediários, bem como qualquer espaço de trabalho que cada tarefa requer. Por exemplo, embora o DOS permita a sintaxe "pipe", ele emprega essa segunda abordagem. Portanto, suponha que algum programa de longa execução "Worker" produza várias mensagens conforme funciona e que um segundo programa, TimeStamp, copia cada registro de stdin para stdout , prefixado pela data e hora do sistema quando o registro é recebido. Uma sequência como produziria carimbos de data / hora apenas quando o Worker tivesse terminado, apenas mostrando a rapidez com que seu arquivo de saída poderia ser lido e gravado. Worker | TimeStamp > LogFile.txt

Um bom exemplo de piping de comando é combinar echocom outro comando para obter algo interativo em um shell não interativo, por exemplo . Isso executa o ftp cliente com a entrada do usuário , pressione retorno , em seguida, passar . echo -e 'user\npass' | ftp localhost

No uso casual, a etapa inicial de um pipeline costuma ser catou echo, ler um arquivo ou string. Isso geralmente pode ser substituído por indireção de entrada ou uma string here , e o uso de cat e piping em vez de redirecionamento de entrada é conhecido como uso inútil de cat . Por exemplo, os seguintes comandos:

$ cat infile | command
$ echo $string | command
$ echo -e 'user\npass' | ftp localhost

pode ser substituído por:

$ command < infile
$ command <<< $string
$ ftp localhost <<< $'user\npass'

Como echocostuma ser um comando interno do shell, seu uso não é tão criticado quanto cat, que é um comando externo.

Redirecionando de e para os identificadores de arquivo padrão

Em shells Unix derivados do shell Bourne original , as duas primeiras ações podem ser modificadas colocando um número (o descritor de arquivo ) imediatamente antes do caractere ; isso afetará qual stream é usado para o redirecionamento. Os fluxos de E / S padrão do Unix são:

Lidar Nome Descrição
0 Stdin Entrada padrão
1 stdout Saída padrão
2 stderr Erro padrão

Por exemplo, executa o comando , direcionando o fluxo de erro padrão para o arquivo1 . command 2> file1

Em shells derivados de csh (o shell C ), a sintaxe, em vez disso, anexa o caractere & ( e comercial) aos caracteres de redirecionamento, obtendo assim um resultado semelhante. A razão para isso é distinguir entre um arquivo chamado '1' e stdout, ie vs . No primeiro caso, stderr é redirecionado para um arquivo chamado ' 1 ' e no segundo, stderr é redirecionado para stdout. cat file 2>1cat file 2>&1

Outro recurso útil é redirecionar um identificador de arquivo padrão para outro. A variação mais popular é mesclar o erro padrão na saída padrão para que as mensagens de erro possam ser processadas junto com (ou alternativamente) a saída normal. Por exemplo, tentará encontrar todos os arquivos denominados .profile . Executado sem redirecionamento, ele produzirá resultados para stdout e erros (por exemplo, por falta de privilégio para atravessar diretórios protegidos) para stderr . Se a saída padrão for direcionada para resultados de arquivo , mensagens de erro aparecerão no console. Para ver as ocorrências e as mensagens de erro nos resultados do arquivo , mescle stderr (identificador 2) em stdout (identificador 1) usando . find / -name .profile > results 2>&12>&1

Se a saída mesclada deve ser canalizada para outro programa, a sequência de mesclagem do arquivo 2>&1deve preceder o símbolo de barra vertical, portanto,find / -name .profile 2>&1 | less

Uma forma de comando simplificada, mas não compatível com POSIX, é (não disponível no Bourne Shell antes da versão 4, lançamento final ou no shell padrão do Debian Almquist usado no Debian / Ubuntu): ou . command > file 2>&1command &>filecommand >&file

É possível usar 2>&1antes de " >", mas o resultado geralmente é mal interpretado. A regra é que qualquer redirecionamento define o identificador para o fluxo de saída de forma independente. Portanto, " 2>&1" define o identificador 2para qualquer identificador que 1aponte, que nesse ponto geralmente é stdout . Em seguida, " >" redireciona o identificador 1para outra coisa, por exemplo, um arquivo, mas não altera o identificador 2, que ainda aponta para stdout .

No exemplo a seguir, a saída padrão é escrito para arquivo , mas os erros são redirecionados de stderr para stdout, ou seja enviado para a tela: . command 2>&1 > file

Para gravar os erros e a saída padrão no arquivo , a ordem deve ser invertida. Saída padrão seria primeiro ser redirecionado para o arquivo, em seguida, stderr seria ainda ser redirecionado para a alça stdout que já foi alterado para apontar para o arquivo: . command > file 2>&1

Pipelines encadeados

Os tokens de redirecionamento e tubulação podem ser encadeados para criar comandos complexos. Por exemplo, classifica as linhas de infile em ordem lexicográfica, escreve linhas exclusivas prefixadas pelo número de ocorrências, classifica a saída resultante numericamente e coloca a saída final em outfile . Esse tipo de construção é usado muito comumente em scripts de shell e arquivos em lote . sort infile | uniq -c | sort -n > outfile

Redirecionar para várias saídas

O comando padrão T pode redirecionar a saída de um comando para vários destinos: . Isso direciona a saída da lista de arquivos para a saída padrão e para o arquivo xyz . ls -lrt | tee xyz

Veja também

links externos