Problema na saída padrão e no erro [duplicado]

6

Se eu digitar

cat > file.txt 2>&1

então file.txt é criado com o conteúdo da entrada padrão de cat . Mas se eu fizer

cat > file.txt 1>&2

então file.txt é criado, mas o arquivo está vazio.

Qual é o problema entre os dois comandos acima?

    
por Vikash 11.02.2015 / 08:11

2 respostas

13

A ordem é importante. O shell processa os redirecionamentos de arquivos na ordem em que são visualizados. Considere:

cat >file.txt 2>&1

Primeiro, a stdout é redirecionada para o arquivo file.txt . Em seguida, stderr é redirecionado para stdout, que é file.txt . Assim, stdout e stderr são enviados para file.txt .

Por contraste, considere:

cat >file.txt 1>&2

Primeiro, a stdout é redirecionada para o arquivo file.txt . (Ao fazer isso, file.txt é criado como um arquivo vazio.) Em seguida, o stdout é redirecionado para stderr. Assim, stdout vai para stderr e nada vai para file.txt e, portanto, file.txt permanece como um arquivo vazio.

Outro caso interessante

Considere:

cat 2>&1 >file.txt

Primeiro, o stderr é redirecionado para o stdout, que ainda é o terminal. Em seguida, o stdout é redirecionado para file.txt . Este segundo redirecionamento não afeta o stderr. Ainda é enviado para o terminal. Não é enviado para file.txt .

Documentação

Esse comportamento está documentado em man bash :

Redirections are processed in the order they appear, from left to right.

Uma exceção a este pedido, que também está documentada em man bash , são pipelines. Considere:

command1 ... | command2

A saída padrão de command1 é enviada pelo pipe para a entrada padrão de command2 e essa conexão é executada antes de qualquer redirecionamento especificado pelo primeiro comando.

Um exemplo com pipelines

Considere:

command1 >file.txt | command2

Como o redirecionamento para file.txt ocorre após o redirecionamento para o pipeline, o stdout de command1 irá para file.txt . command2 não receberá entrada.

    
por 11.02.2015 / 08:32
2

Fazendo '> arquivo 'está realmente fazendo' 1 > Arquivo'. Então, o que você está fazendo é redirecionar o descritor de arquivo 1 duas vezes. Apenas o último entra em vigor.

    
por 11.02.2015 / 09:04

Tags