
Tengo una pregunta tonta para usted: estoy intentando extraer algunas líneas de un archivo que comienza con una cadena especial de caracteres y copiarlas en un archivo. Lo intenté :
cat /dev/ttyACM0 | grep "something" > essai
¡El archivo se crea pero no contiene nada!
Respuesta1
Para mayor eficiencia, utilice grep y muchos otros comandosE/S almacenadas en búfer, es decir, leen grandes bloques de datos a la vez (en lugar de, digamos, un carácter a la vez) y no generan datos hasta que se ha acumulado una cierta cantidad (en lugar de, digamos, escribir una línea a la vez o un personaje a la vez)
Pero, cuando la entrada de un programa proviene de una terminal (como su puerto serie), el sistema operativo le hace un favor al programa y devuelve una línea a la vez (el programa puede cambiar esto poniendo la terminal encrudoomodo no canónico; la mayoría no lo hace).
Y cuando un programa utiliza elstdiobiblioteca, la salida estándar a una terminal (la documentación lo llama "dispositivo interactivo") está, de forma predeterminada, almacenada en búfer de línea, pero la salida a un archivo o canalización está completamente almacenada en búfer.
Un programa que utiliza la biblioteca stdio puede elegir almacenamiento en búfer completo, almacenamiento en búfer de línea o sin almacenamiento en búfer llamandosetvbuf
. También puede llamarfflush
para forzar una escritura cuando lo desee.
GNU grep toma un--line-buffered
opción, que ejecutará elsiguiente códigoen la función que genera una línea coincidente:
if (line_buffered)
fflush (stdout);
Juntando todas las piezas:
Con este comando:
cat /dev/ttyACM0 | grep "something" > essai
cat
leerá una línea a la vez desde /dev/ttyACM0
. Después de haber acumulado unos pocos kilobytes de salida, escribirá en la tubería. Repetirá esto hasta que la lectura devuelva un recuento de cero o falle (lo que probablemente no sucederá hasta que el puerto serie se desconecte).
grep
leerá unos pocos kilobytes a la vez desde la tubería y, después de haber acumulado unos pocos kilobytes de salida, escribirá en el essai
archivo. Repetirá esto hasta que la lectura devuelva un recuento de cero o falle, lo que sucederá si el cat
proceso sale.
Por lo tanto, no verá aparecer nada en el essai
archivo hasta que grep
haya encontrado unos pocos kilobytes de líneas coincidentes.
Para que el resultado se escriba en el archivo más rápidamente, puede darle a GNU grep esa opción:
grep --line-buffered < /dev/ttyACM0 > essai
Dado que se lee desde un puerto serie, se almacenará en búfer de línea y la --line-buffered
opción hará que la línea de salida también se almacene en búfer.