Me gustaría canalizar la salida estándar de un programa mientras lo mantengo en la pantalla.
Con un ejemplo simple (el echo
uso 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 | foo
pero no funciona ya que la salida de tee /dev/stdout
se canaliza afoo
echo 'ee' | tee /dev/stderr
embargo, 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
POSIX
está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/tty
mientras que sustty
comandos aún devuelven un dispositivo utilizable. Aquí hay una solución alternativa:o con una antigua concha de Bourne:
fuente
/dev/tty
es un dispositivo obligatorio de Unix. ¿Estás corriendo en una cárcel BSD?tee
esta manera:cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log
a 1) llevarlo todo a la consola, 2) agregarlo todo a otro archivo, 3) llevar lasfoo
líneas a un archivo diferente./dev/tty
, pero la salida detty
es utilizable.Otra cosa para probar es:
El
>(foo)
es un proceso de sustitución .fuente
foo
tendrá 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 -l
Para evitar tener que recordar todo esto, defino alias:
% alias t tee /dev/tty
% alias wcl wc -l
para que pueda simplemente decir:
% ls [A-J]* | t | wcl
fuente
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
t
es inútil. Puede usar,echo ee | tee $(tty) | foo
pero todavía tiene un comando inútil (tty
), dado que el hecho/dev/tty
simplemente funciona.