Suponha que eu tenha um binário chamado foo
.
Se eu quiser redirecionar a saída de foo
para outro processo bar
, eu poderia escrever ./foo | bar
.
Por outro lado, se eu quisesse time
foo, e redirecionasse a saída, time
eu poderia escrever time (./foo) | bar
,.
Minha pergunta é: como posso colar a saída time
no final da saída foo
e canalizá-la pelo mesmo tubo ?
A solução a seguir não é o que estou procurando, porque inicia duas instâncias separadas do processo bar
, enquanto eu quero um único pipe compartilhado, para uma única instância de bar
.
time (./foo | bar) | bar
Para quem está curioso, o motivo para não querer iniciar duas instâncias bar
é porque bar
pode ser um cliente de rede e quero que as informações de tempo sejam enviadas ao servidor como parte da mesma http POST
mensagem que a saída do processo.
fonte
Respostas:
Se eu entender o que você está pedindo, eu farei. Estou usando os comandos
ls ~
etee
como substitutos de./foo
ebar
, mas a forma geral do que você deseja é esta:NOTA: A saída de
time
já está sendo anexada no final de qualquer saída de./foo
, apenas está sendo feita no STDERR. Para redirecioná-lo através do canal, você precisa combinar STDERR com STDOUT. Você pode usar um|&
ou2>&1
para fazê-lo.Exemplo
E aqui está o conteúdo do arquivo
cmd.log
produzido portee
.fonte
time
envia sua saída para stderr em vez de stdout por padrão. Você só precisa redirecionar para onde quiser.Você diz "Por outro lado, se eu quisesse
time
foo, e redirecionar a saída,time
eu poderia escrevertime (./foo) | bar
". mas isso está realmente incorreto. Nesse caso, a saída de tempo ainda seria exibida no seu console, apenas o stdout seria redirecionado.Você pode redirecionar o stderr especificamente com:
ou todos os tubos com:
Os colchetes são necessários para que isso funcione corretamente.
fonte
Eu descobri que isso funciona no Solaris.
(time ls) &> file
fonte