Me he acostumbrado tanto a hacer esto:
someprogram >output.file
Lo hago cada vez que quiero guardar la salida que genera un programa en un archivo. También conozco las dos variantes de esta redirección de IO :
someprogram 2>output.of.stderr.file
(para stderr)someprogram &>output.stderr.and.stdout.file
(para ambos stdout + stderr combinados)
Hoy me he encontrado con una situación que no creía posible. Uso el siguiente comando xinput test 10
y, como esperaba, tengo el siguiente resultado:
usuario @ nombre de host: ~ $ xinput test 10 pulsación de tecla 30 lanzamiento clave 30 pulsación de tecla 40 lanzamiento clave 40 pulsación de tecla 32 lanzamiento clave 32 pulsación de tecla 65 lanzamiento clave 65 pulsación de tecla 61 lanzamiento clave 61 pulsación de tecla 31 ^ C usuario @ nombre de host: ~ $
Esperaba que esta salida se pudiera guardar como de costumbre en un archivo como el que se usa xinput test 10 > output.file
. Pero cuando contradice mis expectativas, el archivo output.file permanece vacío. Esto también es cierto para xinput test 10 &> output.file
asegurarse de que no me pierda algo en stdout o stderr.
Estoy realmente confundido y, por lo tanto, pregunto aquí si el xinput
programa podría tener una manera de evitar que su salida sea redirigida.
actualizar
He mirado la fuente. Parece que la salida es generada por este código (ver fragmento a continuación). Me parece que la salida sería generada por una impresión ordinaria
// en el archivo test.c eventos_impresión de vacío estático (Display * dpy) { Evento XEvent; mientras que (1) { XNextEvent (dpy, y Evento); // [... algunos otros tipos de eventos se omiten aquí ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int loop; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Event; printf ("key% s% d", (Event.type == key_release_type)? "release": "press", key-> keycode); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]); } printf ("\ n"); } } }
Modifiqué la fuente a esto (vea el siguiente fragmento a continuación), lo que me permite tener una copia de la salida en stderr. Esta salida puedo redirigir:
// en el archivo test.c eventos_impresión de vacío estático (Display * dpy) { Evento XEvent; mientras que (1) { XNextEvent (dpy, y Evento); // [... algunos otros tipos de eventos se omiten aquí ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int loop; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Event; printf ("key% s% d", (Event.type == key_release_type)? "release": "press", key-> keycode); fprintf (stderr, "key% s% d", (Event.type == key_release_type)? "release": "presione", key-> keycode); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]); } printf ("\ n"); } } }
Mi idea en este momento es que tal vez al hacer la redirección, el programa pierde su capacidad de monitorear los eventos de pulsación de teclas.