redireccionamento - porque não funciona desta forma

1

Eu sei que existem 3 fluxos anexados a um processo quando ele é executado, ou seja, o fluxo de entrada, saída e erro.

E o trabalho de execução de redirecionamento da esquerda para a direita.

Eu pretendo executar um comando, redirecionar seu fluxo de saída para um arquivo e seu fluxo de erro para o mesmo arquivo também.

- nofile não existe, o arquivo text1 existe

head nofile text1 1> output.txt 2> output.txt  -- I know this won't work.

head nofile text1 1> output.txt 2>&1 -- while this will work, passing the error stream to the output ste

q1) Por quê?

Se é uma questão de "é suposto ser escrito dessa forma", então por que o trabalho abaixo também não pode

head nofile text1 2>&1 1> output.txt
head nofile text1 2>&1> output.txt

No acima, estou redirecionando o fluxo de erro para o fluxo de saída, o fluxo de saída para o arquivo. Sua lógica é a mesma que a anterior.

    
por Noob 09.07.2015 / 19:49

1 resposta

0

Resposta # 1: Corrida conflito

  • head nofile text1 1> output.txt 2> output.txt # -- I know this won't work.'

Isso realmente funciona, mesmo que não seja como você esperava e não cumpre o seu propósito.
Você tem dois descritores de arquivo que serão redirecionados independentemente para o mesmo arquivo de saída com > output.txt .
Um descritor de arquivo agirá mais rápido: ele criará o arquivo output.txt e começará a escrever nele.
Quando o segundo descritor de arquivos começar a agir, ele recriará o mesmo arquivo ( > output.txt ), apagando o que está dentro.
Você perderá a primeira parte escrita pelo primeiro descritor de arquivo, se houver algum.
Espere uma saída distorcida, especialmente com saídas longas. Veja esta resposta também .
Considere que o comportamento nem sempre é reproduzível. No meu sistema, hoje, o arquivo é criado com o erro dentro como uma primeira linha e o texto depois.

  • head nofile text1 1> output.txt 2>&1 # ok this works

Isso funciona porque primeiro você altera o redirecionamento da saída padrão para o arquivo output.txt . Então você pede para redirecionar o erro padrão para o mesmo destino da saída padrão, que significa o arquivo output.txt .

Resposta # 2: assuntos de ordem
O core da resposta: bash redirecionando não é comutativo significa que pedidos são importantes :

head nofile text1 2>&1 1> output.txt
head nofile text1 2>&1> output.txt

Aqui antes que você peça para redirecionar o erro padrão para o destino saída padrão (provavelmente o atual tty ). Então você pede para mudar somente a saída padrão para o arquivo de saída output.txt . (ambos os comandos 1>output.txt e >output.txt agem da mesma maneira). O erro padrão permanece redirecionado onde estava antes (provavelmente o atual tty ).

    
por 15.07.2015 / 12:17