stdin, stderr, redirecionamento e logs

6

Existe uma diferença entre essas duas linhas?

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

sabendo que gostaria de colocar os erros stdout e de execução do script no arquivo de log. Se não houver diferenças, e se eu quiser registrar a criação de log em si?

    
por 4m1nh4j1 15.05.2014 / 15:58

3 respostas

15

Sim, há uma diferença.

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1

Isso enviará STDOUT e STDERR para /home/user/stdout_and_error.log .

/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

Isso enviará STDOUT para /home/user/stdout_and_error.log e STDERR para o que foi anteriormente STDOUT.

Quando você executa um redirecionamento de shell, o lado esquerdo do redirecionamento vai para onde o lado direito do redirecionamento se dirige atualmente. Significado em 2>&1 , envia STDERR (2) para onde quer que o STDOUT (1) vá atualmente.
Mas se você depois redirecionar o STDOUT para algum outro lugar, o STDERR não o acompanha. Ele continua indo para onde STDOUT estava indo anteriormente. É por isso que no seu primeiro exemplo, tanto o STDOUT quanto o STDERR irão para o mesmo local, mas no segundo eles não o farão.

    
por 15.05.2014 / 16:08
5

Na primeira linha de comando, o shell vê > > primeiro arquivo e acrescentar stdout ao arquivo. O próximo 2 > & 1 envia fd2 (stderr) para o mesmo lugar que fd1 está indo - isto é para o arquivo. E é isso que você quer.

Na segunda linha de comando, o shell vê primeiro 2 > 1. Isso significa que "faça o erro padrão (descritor de arquivo 2) ir para o mesmo lugar que a saída padrão (fd1) está indo." Não há efeito porque tanto fd2 quanto fd1 já estão indo para o terminal. Então > > arquivo acrescenta fd1 (stdout) ao arquivo. Mas o fd2 (stderr) ainda vai para o terminal.

    
por 15.05.2014 / 16:21
2

>> Acrescentando stdout (fluxo # 1) a um arquivo.

2>&1 Combinando stderr (fluxo # 2) com stdout (fluxo # 1) (Adiciona stderr em stdout)

> Grava stdout (stream # 1) em um arquivo, sobrescrevendo o arquivo.

1> Grava stdout (fluxo # 1) em um arquivo, sobrescrevendo o arquivo. O mesmo que acima.

2> Grava stderr (fluxo # 2) em um arquivo, sobrescrevendo o arquivo.

+++

O seu primeiro exemplo acrescentaria stdout a um arquivo, depois adicionaria stderr ao stdout.

O seu segundo exemplo adicionará o stderr ao stdout e, em seguida, anexará o stdout combinado (com o stderr incluído) a um arquivo.

    
por 15.05.2014 / 16:08