Saída direta para pipe e stdout

6

Eu queria saber se existe uma maneira de canalizar a saída de um comando e direcioná-lo para o stdout. Por exemplo, fortune imprime um cookie da sorte e também o copia para a área de transferência:

$ fortune | tee >(?stdout?) | pbcopy 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)
    
por user14492 30.03.2016 / 14:20

3 respostas

5

Sua suposição:

fortune | tee >(?stdout?) | pbcopy

não funcionará porque a saída fortune será gravada como padrão duas vezes, então você duplicará a saída para pbcopy .

No OSX (e outros sistemas suportam /dev/std{out,err,in} ), você pode verificar:

$ echo 1 | tee /dev/stdout | sed 's/1/2/'
2
2

saída 2 duas vezes em vez de 1 e 2 .

Você deve usar outros descritores de arquivo, por exemplo, erro padrão até /dev/stderr :

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2

ou use tty para obter o pseudo-terminal conectado:

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2

Com a opção zsh e multios definida, você não precisa de tee :

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2
    
por 30.03.2016 / 14:58
3

tee sempre grava em sua saída padrão. Se você quiser enviar os dados para um comando, além do terminal onde a saída padrão já está indo, basta usar a substituição do processo com esse comando. (Observe que, apesar de começar com > , a substituição do processo não redireciona a saída padrão, o comando tee a vê como um parâmetro.)

fortune | tee >(pbcopy)
    
por 31.03.2016 / 02:48
0

cuonglm disse tudo.

Apenas tente:

fortune | tee "$(tty)" | pbcopy

tty deve resolver para o pseudo-terminal real (como /dev/pts/99 ) na sessão interativa (ou seja, no terminal) ou no a tty em lote, em e daemon.

    
por 30.03.2016 / 15:54