Eu me acostumei a fazer isso:
someprogram >output.file
Faço isso sempre que quero salvar a saída que um programa gera em um arquivo. Também estou ciente das duas variantes desse redirecionamento de entrada / saída :
someprogram 2>output.of.stderr.file
(para stderr)someprogram &>output.stderr.and.stdout.file
(para stdout + stderr combinados)
Hoje me deparei com uma situação que não considerava possível. Eu uso o seguinte comando xinput test 10
e, como esperado, tenho a seguinte saída:
user @ hostname: ~ $ xinput test 10 pressionar a tecla 30 liberação da chave 30 pressionar a tecla 40 liberação da chave 40 pressionar a tecla 32 liberação da chave 32 pressionar a tecla 65 liberação da tecla 65 pressionar a tecla 61 liberação da tecla 61 pressionar a tecla 31 ^ C usuário @ hostname: ~ $
Eu esperava que essa saída pudesse, como sempre, ser salva em um arquivo como o uso xinput test 10 > output.file
. Mas, ao contrário da minha expectativa, o arquivo output.file permanece vazio. Isso também é válido xinput test 10 &> output.file
apenas para garantir que eu não perca algo no stdout ou stderr.
Estou realmente confuso e, portanto, pergunto aqui se o xinput
programa pode ter uma maneira de evitar que sua saída seja redirecionada?
atualizar
Eu olhei para a fonte. Parece que a saída é gerada por esse código (veja o trecho abaixo). Parece-me que a saída seria gerada por um printf comum
// no arquivo test.c static void print_events (Exibir * dpy) { Evento XEvent; enquanto (1) { XNextEvent (dpy, & Evento); // [... alguns outros tipos de eventos são omitidos aqui ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { loop int; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Event; printf ("chave% s% d", (Event.type == key_release_type)? "release": "pressione", tecla-> código da tecla); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", chave-> primeiro_axis + loop, chave-> eixo_dados [loop]); } printf ("\ n"); } } }
Modifiquei a fonte para isso (veja o próximo trecho abaixo), o que me permite ter uma cópia da saída no stderr. Esta saída eu sou capaz de redirecionar:
// no arquivo test.c static void print_events (Exibir * dpy) { Evento XEvent; enquanto (1) { XNextEvent (dpy, & Evento); // [... alguns outros tipos de eventos são omitidos aqui ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { loop int; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Event; printf ("chave% s% d", (Event.type == key_release_type)? "release": "pressione", tecla-> código da tecla); fprintf (stderr, "chave% s% d", (Event.type == key_release_type)? "release": "pressione", tecla-> código da tecla); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", chave-> primeiro_axis + loop, chave-> eixo_dados [loop]); } printf ("\ n"); } } }
Minha idéia no momento é que, talvez, ao redirecionar o programa perca a capacidade de monitorar os eventos de liberação de tecla.