Saída direta para pipe e stdout

14

Eu queria saber se existe uma maneira de canalizar a saída de um comando e direcioná-lo para o stdout. Por exemplo, fortuneimprime um biscoito 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)
user14492
fonte
Eu não tenho meu OSX em mãos, e quanto fortune | tee $(tty) | pbcopy?
Archemar 30/03

Respostas:

9

Sua suposição:

fortune | tee >(?stdout?) | pbcopy

não funcionará porque a fortunesaída será gravada em padrão duas vezes, então você dobrará a saída para pbcopy.

No OSX (e em outros sistemas suportados /dev/std{out,err,in}), você pode verificá-lo:

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

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

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

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

ou use ttypara obter o pseudo terminal conectado:

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

Com zshe multiosconjunto de opções, você não precisa de teenada:

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2
cuonglm
fonte
tee $(tty)Ou, você sabe,tee /dev/tty
Kenster 30/03/16
ótima explicação, o melhor para responder a todos.
Merlin
10

teesempre grava em sua saída padrão. Se você deseja enviar os dados para um comando, além do terminal para o qual a saída padrão já está indo, basta usar a substituição de 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 teecomando a vê como um parâmetro.)

fortune | tee >(pbcopy)
Gilles 'SO- parar de ser mau'
fonte
Isso é bom, também é uma boa solução.
Merlin
0

cuonglm disse tudo.

Apenas tente:

fortune | tee "$(tty)" | pbcopy

ttydeve resolver o pseudo-terminal real (como /dev/pts/99) na sessão interativa (ou seja, no terminal), ou não um lote no lote, no at e daemon.

Archemar
fonte