¿Por qué el command cat solo lee desde el primer descriptor de file?

Desde la console, creé 2 files vacíos e intenté leerlos simultáneamente.

$ echo -n '' | tee f1 > f2 $ cat f1 f2 $ cat <(tail -f f1) <(tail -f ./f2) 

En la otra console ejecuté mis testings.

 $ echo 'tee test' | tee -a f1 >> f2 $ echo 'f1 test' >> f1 $ echo 'f2 test' >> f2 $ cat f1 f2 tee test f1 test tee test f2 test 

Sin embargo, cat en la primera console solo lee salidas de la primera fd .

 $ cat <(tail -F ./f1) <(tail -F ./f2) tee test f1 test 

¿Por qué? ¿Cómo puedo leer simultáneamente desde dos o más descriptores de file?

cat procesa sus arguments secuencialmente; tail -f f1 continúa ejecutándose, por lo que cat espera la input de <(tail -f f1) , y no pasa al procesamiento <(tail -f f2) .

Verás la salida de la tail -f f2 si matas la primera tail .

Una mejor herramienta para rastrear múltiples files simultáneamente es la tail misma (al less, la tail GNU):

 tail -f f1 f2 

Si no desea ver los encabezados de los files, use -q :

 tail -qf f1 f2 

cat ab no lee simultáneamente de a y b ; abre a , lo lee de principio a fin, cierra a , y luego continúa para hacer lo mismo con el siguiente file que se le dio como argumento.

En el caso donde los arguments son pseudo-files que hacen tail -f y por lo tanto no tienen un "final", cat solo leerá desde el primer file.

Si por alguna razón todo lo que necesita es abrir muchos files a la vez, paste podría ser una forma:

 $ echo f1 >f1; echo f2 >f2 $ cat <(tail -F f1) <(tail -F f2) f1 ^C $ paste <(tail -F f1) <(tail -F f2) f1 f2 ^C