Como redirecionar stderr e stdout para arquivos diferentes na mesma linha no script?

180

Eu sei disso:

$ command 2>> error

$ command 1>> output

Existe alguma maneira de eu enviar o stderr para o arquivo de erro e o stdout para o arquivo de saída na mesma linha do bash?

user784637
fonte

Respostas:

292

Basta adicioná-los em uma linha command 2>> error 1>> output

No entanto, observe que >>é para anexar se o arquivo já tiver dados. Visto que, >substituirá todos os dados existentes no arquivo.

Então, command 2> error 1> outputse você não deseja anexar.

Apenas para concluir, você pode escrever 1>como apenas >uma vez que o descritor de arquivo padrão é a saída. assim 1>e >é a mesma coisa.

Então, command 2> error 1> outputtorna-se,command 2> error > output

Sujoy
fonte
3
Ótima resposta! Eu realmente gosto de sua explicação de como 1>pode ser escrita como>
user784637
Como isso é diferente de como command &2>err.log, acho que estou com sintaxias totalmente confusas. (Um link para uma resposta adequada de todos os festança tubulação-ismos poderia estar em ordem)
ThorSummoner
4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html é o que eu acho que você está procurando. Fwiw, parece que command &2>err.lognão é muito legítimo - o e comercial nessa sintaxe é usado para o descritor de arquivo como destino, por exemplo command 1>&2, redirecionaria o stdout para o stderr.
DreadPirateShawn
@DreadPirateShawn, por favor não vincule o ABS como referência - ele ocasionalmente contém imprecisões diretas e, com muita frequência, contém exemplos de práticas inadequadas. O wiki.bash-hackers.org/howto/redirection_tutorial é uma fonte de referência muito melhor no redirecionamento.
Charles Duffy
27

Tente o seguinte:

your_command 2>stderr.log 1>stdout.log

Mais Informações

Os números 0através 9são descritores de arquivo no bash. 0significa entrada padrão, 1significa saída padrão, 2significa erro padrão. 3através 9são de reposição para qualquer outro uso temporário.

Qualquer descritor de arquivo pode ser redirecionado para um arquivo ou para outro descritor de arquivo usando o operador >. Em vez disso, você pode usar o operador >>para anexar a um arquivo em vez de criar um vazio.

Uso:

file_descriptor > filename

file_descriptor > &file_descriptor

Por favor, consulte Bash-Scripting Guia Avançado: Capítulo 20. I / O redirecionamento .

Quintus.Zhou
fonte
Thanks.i procurando por uma hora
dılo sürücü 14/03
12

Curtiu isso:

$ command >>output 2>>error
Didier Trosset
fonte
9

Ou se você gosta de misturar saídas (stdout e stderr) em um único arquivo, pode usar:

command > merged-output.txt 2>&1
ztank1013
fonte
32
Esta não é uma resposta para a pergunta.
Matthias
Por que as pessoas mesclam resultados ou sugerem resultados mesclados?
Nurettin
@ urettin: talvez você tenha uma linha de script que apenas execute um comando e salve instantaneamente a saída em um arquivo de log. Às vezes, o comando em questão pode falhar, portanto, você também deseja salvar os erros, mas no mesmo arquivo de log.
Streamofstars 22/05/19
@streamofstars sim, claro que você está certo, talvez às vezes seja isso que as pessoas querem, eu estava comentando dentro do contexto desta pergunta como alguém que estava procurando respostas e encontrou muitas irrelevantes em todo o fluxo de pilha.
Nurettin
0

A saída de vários comandos pode ser redirecionada. Isso funciona para a linha de comando ou de maneira mais útil em um script bash. O -sdireciona o prompt de senha para a tela.

Os cmds hereblock stdout / stderr são enviados para arquivos separados e nada para exibir.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Os cmds de herança stdout / stderr são enviados para um único arquivo e exibidos.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Os cmds hereblock stdout / stderr são enviados para arquivos separados e stdout para exibição.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

Dependendo de quem você é (whoami) e do nome de usuário, uma senha pode ou não ser necessária.

rahogaboom
fonte