salida redirigir redireccionar redireccionamiento por matematicas fichero estándar estandar error enviar entrada comando archivo and bash shell pipe output stdout

bash - redirigir - ¿Cómo canalizar la salida estándar mientras la mantiene en pantalla?(y no a un archivo de salida)



salida estandar (5)

Me gustaría canalizar la salida estándar de un programa mientras lo mantengo en la pantalla.

Con un simple ejemplo (el uso del echo aquí es solo para fines ilustrativos):

$ echo ''ee'' | foo
ee <- la salida que me gustaría ver

Sé que podría copiar el stdout al archivo, pero eso no es lo que quiero.
$ echo ''ee'' | tee output.txt | foo

Lo intenté
$ echo ''ee'' | tee /dev/stdout | foo pero no funciona, ya que la salida en T a /dev/stdout se canaliza a foo


Aquí hay una solución que funciona en cualquier implementación de Unix / Linux, suponiendo que cumpla con el estándar POSIX . Funciona en algunos entornos que no son Unix como cygwin también.

echo ''ee'' | tee /dev/tty | foo

Referencia: las especificaciones de base de Open Group, número 7 IEEE Std 1003.1, edición 2013, §10.1 :

/ dev / tty

Asociado con el grupo de proceso de ese proceso, si hay alguno. Es útil para programas o procedimientos de shell que desean asegurarse de escribir mensajes o leer datos del terminal sin importar cómo se haya redirigido el resultado. También se puede usar para aplicaciones que exigen el nombre de un archivo para salida, cuando se desea una salida escrita y es tedioso averiguar qué terminal está actualmente en uso. En cada proceso, un sinónimo de la terminal de control


El acceso a "/ dev / stdout" está denegado en algunos sistemas, pero el acceso al terminal de usuario viene dado por "/ dev / tty". Usando "wc" para "foo", los ejemplos anteriores funcionan bien (en Linux, OSX, etc.) como:

% echo ''Hi'' | tee /dev/tty | wc Hi 1 1 3

Para agregar un conteo en la parte inferior de una lista de archivos coincidentes, uso algo como:
% ls [AJ]* | tee /dev/tty | wc -l

Para evitar tener que recordar todo esto, defino alias:
% alias t tee /dev/tty
% alias wcl wc -l

para que pueda decir simplemente:
% ls [AJ]* | t | wcl

POSTSCRIPT: Para el grupo más joven, que podría reírse de su pronunciación como "titty", podría agregar que "tty" fue la abreviatura común de un terminal "teletipo", que usaba un rollo de papel amarillo y tenía teclas redondas que a menudo atascado.



Tratar:

$ echo ''ee'' | tee /dev/stderr | foo

Si usa stderr es una opción, por supuesto.


primero necesita averiguar el terminal asociado con su pantalla (o cualquier pantalla en la que desee que se muestre la salida):

tty

entonces puede poner la salida en ese terminal y canalizar la otra copia a través de su programa foo:

echo ee | tee /dev/pty/2 | foo