Salida directa a tubería y stdout

14

Me preguntaba si hay una manera de canalizar la salida de un comando y dirigirlo al stdout. Entonces, por ejemplo, fortuneimprime una galleta de la fortuna y también la copia en el portapapeles:

$ fortune | tee >(?stdout?) | pbcopy 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)
usuario14492
fuente
No tengo mi OSX a mano, ¿qué pasa fortune | tee $(tty) | pbcopy?
Archemar

Respuestas:

9

Su suposición:

fortune | tee >(?stdout?) | pbcopy

no funcionará porque la fortunesalida se escribirá en el estándar dos veces, por lo que duplicará la salida en pbcopy.

En OSX (y otros sistemas de soporte /dev/std{out,err,in}), puede verificarlo:

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

salida 2dos veces en lugar de 1y 2.

Debe usar otros descriptores de archivo, ejemplo error estándar a través de /dev/stderr:

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

o use ttypara obtener el pseudo terminal conectado:

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

Con zshy multiosconjunto de opciones, que no es necesario teeen absoluto:

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2
Cuonglm
fuente
tee $(tty)O, ya sabes,tee /dev/tty
Kenster
Gran explicación, la respuesta superior SO por todas partes.
Merlín
10

teesiempre escribe en su salida estándar. Si desea enviar los datos a un comando además del terminal donde ya está yendo la salida estándar, simplemente use la sustitución del proceso con ese comando. (Tenga en cuenta que a pesar de comenzar >, la sustitución del proceso no redirige la salida estándar, el teecomando lo ve como un parámetro).

fortune | tee >(pbcopy)
Gilles 'SO- deja de ser malvado'
fuente
Esto es bueno, también es una buena solución.
Merlín
0

Cuonglm lo dijo todo.

Sólo inténtalo:

fortune | tee "$(tty)" | pbcopy

ttydebe resolverse a pseudo terminal real (como /dev/pts/99) en sesión interactiva (es decir, en terminal), o no a tty en batch, at y daemon.

Archemar
fuente