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