Sou novo no Linux e estou tentando entender como os redirecionamentos funcionam.
Eu tenho testado várias sintaxes para redirecionar stdout
e stderr
para o mesmo arquivo, o que não produz todos os mesmos resultados.
Por exemplo, se eu tentar listar 2 arquivos que não existem ( file1
e file2
) e 2 que não existem ( foo
e fz
):
Sintaxe # 1 (sem redirecionamento):
$ ls file1 foo fz file2
Aqui está a saída que recebo no terminal:
ls: cannot access file1: No such file or directory
ls: cannot access file2: No such file or directory
foo fz
Sintaxe # 2:
Agora, com redirecionamento:
$ ls file1 foo fz file2 > redirect 2>&1
O arquivo redirect
contém o mesmo resultado da Sintaxe # 1:
ls: cannot access file1: No such file or directory
ls: cannot access file2: No such file or directory
foo
fz
Portanto, com as duas sintaxes acima, parece que o shell imprime stderr
primeiro e, em seguida, stdout
.
Sintaxe # 3:
Agora, se eu tentar com uma das seguintes sintaxes:
$ ls file1 foo fz file2 > redirect 2> redirect
ou
$ ls file1 foo fz file2 2> redirect > redirect
Em seguida, o arquivo redirect
conterá isso:
foo
fz
nnot access file1: No such file or directory
ls: cannot access file2: No such file or directory
Aqui, parece que stdout
é impresso antes de stderr
, mas depois vemos que o início de stderr
é "recortado" pelo mesmo número de caracteres que stdout
.
O stdout
tem 6 caracteres ( foo fz
, retorno de carro incluído), portanto, os primeiros 6 caracteres de stderr
( ls: ca
) foram substituídos por stdout
.
Portanto, parece que stderr
foi impresso primeiro e que stdout
foi impresso sobre stderr
em vez de ser anexado a ele.
No entanto, teria feito mais sentido para mim se stderr
tivesse sido completamente apagado e substituído por stdout
, em vez de ser apenas parcialmente substituído.
Sintaxe # 4:
A única maneira que encontrei para corrigir a Sintaxe # 3 é adicionando o operador append ao stdout
:
$ ls file1 foo fz file2 >> redirect 2> redirect
ou
$ ls file1 foo fz file2 2> redirect >> redirect
Que produz o mesmo que a sintaxe # 2:
ls: cannot access file1: No such file or directory
ls: cannot access file2: No such file or directory
foo
fz
Este artigo aqui explica que a sintaxe # 3 está errada (presumivelmente, assim é a sintaxe # 4). Mas, por razões de argumentação: por que a sintaxe nº 3 está errada? O que exatamente está dizendo (ou não dizendo) o shell para fazer em oposição à Sintaxe # 2?
Além disso, há uma razão pela qual a saída sempre exibe stderr
antes de stdout
?
Obrigado!