Questão Como redirecionar o stderr para um arquivo [duplicado]


Esta questão já tem uma resposta aqui:

Ao usar o nohup para colocar um comando para rodar em segundo plano, alguns dos conteúdos aparecem no terminal.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Eu quero salvar esse conteúdo em um arquivo.


163
2018-05-18 12:31


origem




Respostas:


Existem dois fluxos de saída principais no Linux (e outros sistemas operacionais), saída padrão (stdout) e erro padrão (stderr). Mensagens de erro, como as que você mostra, são impressas com erro padrão. O operador de redirecionamento clássico (command > file) apenas redireciona a saída padrão, de modo que o erro padrão ainda é mostrado no terminal. Para redirecionar o stderr também, você tem algumas opções:

  1. Redirecionar stdout para um arquivo e stderr para outro arquivo:

    command > out 2>error
    
  2. Redirecionar stderr para stdout (&1) e, em seguida, redireciona o stdout para um arquivo:

    command >out 2>&1
    
  3. Redirecionar ambos para um arquivo:

    command &> out
    

Para obter mais informações sobre os vários operadores de controle e redirecionamento, consulte Aqui.


265
2018-05-18 12:50



assim hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & ou hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 ou hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria sim. Mas os dois últimos comandos são equivalentes, eles enviarão erro e saída para o mesmo arquivo. - terdon♦
Como no link que você forneceu, eu poderia usar | & em vez de 2> & 1 eles são equivalentes, obrigado pelo seu tempo. - André M. Faria
Oi, consegui simplificar isso para: command 2> out. - Surya Teja Karra
@SuryaTejaKarra que apenas redireciona stderr, mas não stdout. - terdon♦


A primeira coisa a notar é que há algumas maneiras, dependendo do seu propósito e shell, portanto, isso requer um pequeno entendimento de vários aspectos. Mais típico, é via 2> dentro Conchas semelhantes a Bourne, tal como dash (que é ligado simbolicamente a /bin/sh) e bash; primeiro é o shell padrão e compatível com POSIX e o outro é o que a maioria dos usuários usa para a sessão interativa. Eles diferem na sintaxe e nos recursos, mas, felizmente, para nós, o redirecionamento de fluxo de erro funciona da mesma forma (exceto o &> não um padrão). No caso de csh e seus derivados, o redirecionamento stderr não funciona bem lá.

Vamos voltar para 2> parte. Duas coisas importantes para notar: > significa operador de redirecionamento, onde abrimos um arquivo e 2 integer significa descritor de arquivo stderr; na verdade, é exatamente assim que o padrão POSIX para a linguagem shell define o redirecionamento seção 2.7:

[n]redir-op word

Para simples > redirecionamento, o 1 inteiro está implícito para stdout, isto é echo Hello World > /dev/null é o mesmo que echo Hello World 1>/dev/null. Observe que o operador inteiro ou de redirecionamento não pode ser citado, caso contrário, o shell não os reconhece como tal e, em vez disso, trata como uma cadeia de texto literal. Quanto ao espaçamento, é importante que o número inteiro esteja ao lado do operador de redirecionamento, mas o arquivo pode estar ao lado do operador de redirecionamento ou não, ou seja, command 2>/dev/null e command 2> /dev/null vai funcionar muito bem.

A sintaxe um pouco simplificada para o comando típico no shell seria

 command [arg1] [arg2]  2> /dev/null

O truque aqui é que o redirecionamento pode aparecer em qualquer lugar. Isso é tanto 2> command [arg1] e command 2> [arg1] é válido. Note que para bash shell, lá existe &> maneira de redirecionar ambos os fluxos stdout e stderr ao mesmo tempo, mas novamente - é bash específico e se você está se esforçando para a portabilidade de scripts, pode não funcionar. Veja também Wiki do Ubuntu e Qual é a diferença entre &> e 2> & 1.

Nota: o > operador de redirecionamento truncaum arquivo e sobrescreve-o, se o arquivo existir. o 2>> pode ser usado para anexar stderr arquivar.

Se você perceber, > é destinado a um único comando. Para scripts, podemos redirecionar o fluxo stderr de todo o script de fora como em myscript.sh 2> /dev/null ou podemos fazer uso de exec built-in. O exec built-in tem o poder de religar o fluxo para toda a sessão de shell, por assim dizer, seja interativamente ou via script. Algo como

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

Neste exemplo, o arquivo de log deve mostrar stat: cannot stat '/etc/non_existing_file': No such file or directory.

Ainda outra maneira é via funções. Como kopciuszek anotado em sua resposta, podemos escrever declaração de função com o redirecionamento já anexado, que é

some_function(){
    command1
    command2
} 2> my_log_file.txt

5
2018-05-03 07:48