Redirecionamento (computação) - Redirection (computing)
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 > file1
executa 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 < file1
executa command1 , com file1 como a fonte de entrada, ao contrário do teclado , que é a fonte usual de entrada padrão.
command < infile > outfile
combina 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
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 echo
com 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 cat
ou 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 echo
costuma 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>1
cat 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>&1
2>&1
Se a saída mesclada deve ser canalizada para outro programa, a sequência de mesclagem do arquivo 2>&1
deve 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>&1
command &>file
command >&file
É possível usar 2>&1
antes 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 2
para qualquer identificador que 1
aponte, que nesse ponto geralmente é stdout . Em seguida, " >
" redireciona o identificador 1
para 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
- Here-document , uma maneira de especificar o texto para entrada em shells de linha de comando
- Pá de concha
- Substituição de comando
- Substituição de processo
links externos
- The Single UNIX Specification , Issue 7 from The Open Group : duplicar um descritor de arquivo aberto - Referência de interfaces do sistema,
- Definição de redirecionamento por The Linux Information Project (LINFO)
- Redirecionamento de E / S no Projeto de Documentação do Linux
- Redirecionamento no Windows
- Criando um processo filho com entrada e saída redirecionadas no Windows