É bem conhecido como canalizar a saída padrão de um processo para outra entrada padrão de processos:
proc1 | proc2
Mas e se eu quiser enviar o erro padrão de proc1 para proc2 e deixar a saída padrão indo para o local atual? Você pensaria que bash
teria um comando ao longo das linhas de:
proc1 2| proc2
Mas, infelizmente, não. Há alguma maneira de fazer isso?
rc
, que é outro shell. Por exemplo:proc1 |[2] proc2
. Não é legal? Não nobash
entanto.Respostas:
Também há substituição de processo . O que faz com que um processo substitua um arquivo.
Você pode enviar
stderr
para um arquivo da seguinte maneira:Mas você pode substituir um processo pelo arquivo da seguinte maneira:
Aqui está um exemplo concreto que envia
stderr
para a tela e anexa a um arquivo de logfonte
weston --help 2> >(less)
), e ele quebrou o meu escudo, eu tinha que sair e fazer login novamente.weston --help
eless
estão esperando para ter uma interação teclado, mas apenas 1 deles recebe, então você pode estar em uma situação embaraçosa. Tente fazer testes com algo parecidogrep
. Além disso, você pode achar que as duas entradas de mouse / teclado estão indo para o segundo comando de qualquer maneira, e não para weston.Você pode usar o seguinte truque para trocar
stdout
estderr
. Então você apenas usa a funcionalidade de canal regular.Fornecido
stdout
estderr
ambos apontaram para o mesmo lugar no início, isso vai lhe dar o que você precisa.O que o
x>y
bit faz é alterar o identificador de arquivo,x
para que ele agora envie suas informações para onde o identificador de arquivoy
aponta atualmente. Para o nosso caso específico:3>&1
cria um novo identificador3
que será exibido no identificador atual1
(stdout original), apenas para salvá-lo em algum lugar para o marcador final abaixo.1>&2
modifica o identificador1
(stdout) para enviar para o identificador atual2
(stderr original).2>&3-
modifica o identificador2
(stderr) para enviar para o identificador atual3
(stdout original) e depois fecha o identificador3
(via-
no final).É efetivamente o comando swap que você vê nos algoritmos de classificação:
fonte
1>&2-
aqui e não apenas1>&2
? Não entendo por que queremos fechar o fd2
, se vamos apenas reabrir / reatribuí-lo imediatamente.O Bash 4 possui este recurso:
O zsh também possui esse recurso.
-
Com outras conchas / mais antigas, insira isso explicitamente como
FirstCommand 2> & 1 | OtherCommand
fonte
OtherCommand
escreve os dados combinados em algum lugar, possivelmente em outro lugar. Portanto, não são os mesmos dados e estão potencialmente indo para outro lugar. Isso é exatamente o oposto do desejo do OP, não é?proc1
saídas para stdout e stderr e você deseja que o stderr vá para o stdin deproc2
(que é o local para onde o stdout do proc1 está indo), minha resposta é essa. Dei ao OP o que ele pedia , talvez não o que ele pretendia pedir. Aí reside a ambiguidade potencial. O OP aceitou a resposta que troca stdout e stderr, que não é o que ele pediu.A troca é excelente, pois resolve o problema. Caso você nem precise do stdout original, faça-o desta maneira:
A ordem é vital; você não iria querer:
Como isso irá redirecionar tudo para
/dev/null
!fonte
Nenhuma delas realmente funcionou muito bem. A melhor maneira que eu encontrei de fazer o que você queria é:
Isso funciona apenas para casos em
command
que não precisa de entrada do teclado. por exemplo:colocaria erros de gzip em menos
fonte