Sono diventato così abituato a fare questo:
someprogram >output.file
Lo faccio ogni volta che voglio salvare l'output che un programma genera in un file. Sono anche a conoscenza delle due varianti di questo reindirizzamento IO :
someprogram 2>output.of.stderr.file
(per stderr)someprogram &>output.stderr.and.stdout.file
(sia per stdout + stderr combinati)
Oggi ho incontrato una situazione che non pensavo fosse possibile. Uso il seguente comando xinput test 10
e come previsto ho il seguente output:
user @ hostname: ~ $ test di input x 10 tasto premere 30 rilascio chiave 30 tasto premuto 40 rilascio chiave 40 tasto premuto 32 rilascio chiave 32 tasto 65 rilascio chiave 65 tasto premuto 61 rilascio chiave 61 tasto premere 31 ^ C utente @ hostname: ~ $
Mi aspettavo che questo output potesse essere salvato come al solito in un file come l'utilizzo xinput test 10 > output.file
. Ma quando è in contrasto con le mie aspettative, il file output.file rimane vuoto. Questo vale anche xinput test 10 &> output.file
solo per essere sicuro di non perdere qualcosa su stdout o stderr.
Sono davvero confuso e quindi chiedo qui se il xinput
programma potrebbe avere un modo per evitare il reindirizzamento del suo output?
aggiornare
Ho guardato la fonte. Sembra che l'output sia generato da questo codice (vedi lo snippet di seguito). Mi sembra che l'output sarebbe generato da un normale printf
// nel file test.c static void print_events (Display * dpy) { Evento XEvent; while (1) { XNextEvent (dpy, & Event); // [... alcuni altri tipi di eventi sono omessi qui ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int loop; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Event; printf ("chiave% s% d", (Event.type == key_release_type)? "release": "premi", chiave-> codice chiave); per (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]); } printf ( "\ n"); } } }
Ho modificato la fonte in questo (vedi il prossimo frammento di seguito), che mi permette di avere una copia dell'output su stderr. Questo output sono in grado di reindirizzare:
// nel file test.c static void print_events (Display * dpy) { Evento XEvent; while (1) { XNextEvent (dpy, & Event); // [... alcuni altri tipi di eventi sono omessi qui ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int loop; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Event; printf ("chiave% s% d", (Event.type == key_release_type)? "release": "premi", chiave-> codice chiave); fprintf (stderr, "chiave% s% d", (Event.type == key_release_type)? "release": "premi", chiave-> codice chiave); per (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]); } printf ( "\ n"); } } }
La mia idea al momento è che forse eseguendo il reindirizzamento il programma perde la sua capacità di monitorare gli eventi di rilascio dei tasti.