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 10e, 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.fileapenas para garantir que eu não perca algo no stdout ou stderr.
Estou realmente confuso e, portanto, pergunto aqui se o xinputprograma 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.