Me gustaría canalizar la salida estándar de un programa mientras lo mantengo en la pantalla.
Con un ejemplo simple (el echouso aquí es solo para fines ilustrativos):
$ echo 'ee' | foo
ee <- la salida que me gustaría ver
Sé que tee podría copiar stdout a un archivo, pero eso no es lo que quiero.
$ echo 'ee' | tee output.txt | foo
Lo intenté
$ echo 'ee' | tee /dev/stdout | foopero no funciona ya que la salida de tee /dev/stdoutse canaliza afoo

echo 'ee' | tee /dev/stderrembargo, tenga en cuenta que funciona, por lo que si stderr también satisface su requisito "en pantalla" , eso funcionará.Respuestas:
Aquí hay una solución que funciona en cualquier implementación de Unix / Linux, suponiendo que cumpla con el
POSIXestándar. Funciona también en algunos entornos que no son Unixcygwin.Referencia: The Open Group Base Especificaciones Número 7 IEEE Std 1003.1, Edición 2013, §10.1 :
Se ha informado que algunos entornos como Google Colab no se implementan
/dev/ttymientras que susttycomandos aún devuelven un dispositivo utilizable. Aquí hay una solución alternativa:o con una antigua concha de Bourne:
fuente
/dev/ttyes un dispositivo obligatorio de Unix. ¿Estás corriendo en una cárcel BSD?teeesta manera:cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.loga 1) llevarlo todo a la consola, 2) agregarlo todo a otro archivo, 3) llevar lasfoolíneas a un archivo diferente./dev/tty, pero la salida dettyes utilizable.Otra cosa para probar es:
El
>(foo)es un proceso de sustitución .fuente
footendrá que ser parte de la sustitución del proceso. Aquí hay un ejemplo:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')echo 'ee' | tee >(cat) | foo | bar.El acceso a "/ dev / stdout" está denegado en algunos sistemas, pero el acceso al terminal de usuario está dado por "/ dev / tty". Usando "wc" para "foo", los ejemplos anteriores funcionan bien (en Linux, OSX, etc.) como:
Para agregar un recuento al final de una lista de archivos coincidentes, utilizo algo como:
% ls [A-J]* | tee /dev/tty | wc -lPara evitar tener que recordar todo esto, defino alias:
% alias t tee /dev/tty% alias wcl wc -lpara que pueda simplemente decir:
% ls [A-J]* | t | wclfuente
Tratar:
Si usar stderr es una opción, por supuesto.
fuente
primero debe averiguar el terminal asociado con su pantalla (o la pantalla en la que desea que se muestre la salida):
entonces puede conectar la salida a esa terminal y canalizar la otra copia a través de su programa foo:
fuente
tes inútil. Puede usar,echo ee | tee $(tty) | foopero todavía tiene un comando inútil (tty), dado que el hecho/dev/ttysimplemente funciona.