Я вже так звик це робити:
someprogram >output.file
Я роблю це, коли хочу зберегти вихідний файл, який програма генерує у файл. Я також знаю два варіанти цього перенаправлення IO :
someprogram 2>output.of.stderr.file
(для stderr)someprogram &>output.stderr.and.stdout.file
(для обох stdout + stderr у поєднанні)
Сьогодні я зіткнувся з ситуацією, яку не вважав можливою. Я використовую таку команду xinput test 10
і, як очікувалося, у мене є такий вихід:
user @ hostname: ~ $ xinput test 10 натисніть клавішу 30 випуск ключа 30 натисніть клавішу 40 випуск ключа 40 натисніть клавішу 32 випуск ключа 32 клавіша 65 випуск ключа 65 натисніть клавішу 61 випуск ключа 61 натисніть клавішу 31 ^ С user @ hostname: ~ $
Я очікував, що цей вихід, як завжди, може бути збережений у такий файл, як використання xinput test 10 > output.file
. Але коли протилежне моєму очікуванню, файл output.file залишається порожнім. Це також справедливо xinput test 10 &> output.file
лише для того, щоб я не пропустив щось на stdout або stderr.
Я дуже розгублений і тому запитую тут, чи xinput
може програма мати спосіб уникнути перенаправлення результатів?
оновлення
Я подивився на джерело. Здається, вихід генерується цим кодом (див. Фрагмент нижче). Мені здається, вихід буде створений звичайним printf
// у файлі test.c статичний недійсний print_events (Відображення * dpy) { XEvent подія; while (1) { XNextEvent (dpy та події); // [... тут введено деякі інші типи подій ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int петля; Клавіша XDeviceKeyEvent * = (XDeviceKeyEvent *) & подія; printf ("ключ% s% d", (Event.type == key_release_type)? "release": "натиснути", key-> keycode); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [петля]); } printf ("\ n"); } } }
Я змінив джерело на це (див. Наступний фрагмент нижче), що дозволяє мені мати копію виводу на stderr. Цей вихід я в змозі перенаправити:
// у файлі test.c статичний недійсний print_events (Відображення * dpy) { XEvent подія; while (1) { XNextEvent (dpy та події); // [... тут введено деякі інші типи подій ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int петля; Клавіша XDeviceKeyEvent * = (XDeviceKeyEvent *) & подія; printf ("ключ% s% d", (Event.type == key_release_type)? "release": "натиснути", key-> keycode); fprintf (stderr, "key% s% d", (Event.type == key_release_type)? "release": "натиснути", key-> keycode); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [петля]); } printf ("\ n"); } } }
Моя ідея в даний час полягає в тому, що, можливо, перенаправлення програми втрачає здатність контролювати події випуску клавіш.