Parece que as versões mais recentes do bash têm o &>
operador, que (se bem entendi), redireciona stdout e stderr para um arquivo ( &>>
acrescenta ao arquivo, como Adrian esclareceu).
Qual é a maneira mais simples de conseguir a mesma coisa, mas ao invés de canalizar para outro comando?
Por exemplo, nesta linha:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Gostaria que o grep correspondesse ao conteúdo em stdout e stderr (efetivamente, combine-os em um fluxo).
Nota : esta pergunta é sobre canalização, não redirecionamento - portanto, não é uma duplicata da pergunta que está atualmente marcada como duplicada.
|&
atalho, que eu acho que é de longe a solução mais conveniente para "redirecionar stdout e stderr para um pipe".Respostas:
(Observe que
&>>file
anexa a um arquivo enquanto&>
redirecionaria e substituiria um arquivo existente anteriormente.)Para combinar
stdout
estderr
você redirecionaria o último para o primeiro usando2>&1
. Isso redireciona stderr (descritor de arquivo 2) para stdout (descritor de arquivo 1), por exemplo:stdout
vai para stdout,stderr
vai para stderr.grep
só vêstdout
, daístderr
imprime no terminal.Por outro lado:
Após gravar em stdout e stderr,
2>&1
redireciona o stderr de volta para o stdout egrep
vê as duas strings no stdin, filtrando as duas.Você pode ler mais sobre redirecionamento aqui .
Em relação ao seu exemplo (POSIX):
ou, usando
>=bash-4
:fonte
&>>
. Corrigi minha pergunta.|&
vez de2>&1 |
.|&
proposto por AdrianFrühwirth para futuros leitores: esse recurso é suportado apenas nabash
versão 4+. Se você estiver usando 3 ou menos, terá que ficar com2>&1 |
.O Bash tem uma abreviação para
2>&1 |
, a saber|&
, quais canais stdout e stderr (consulte o manual ):Isso foi introduzido no Bash 4.0, veja as notas de versão .
fonte