Saya sudah terbiasa melakukan ini:
someprogram >output.file
Saya melakukannya setiap kali saya ingin menyimpan output yang dihasilkan suatu program ke file. Saya juga mengetahui dua varian pengalihan IO ini :
someprogram 2>output.of.stderr.file
(untuk stderr)someprogram &>output.stderr.and.stdout.file
(untuk kedua stdout + stderr digabungkan)
Hari ini saya telah mengalami situasi yang saya pikir tidak mungkin. Saya menggunakan perintah berikut xinput test 10
dan seperti yang diharapkan, saya memiliki output sebagai berikut:
user @ hostname: ~ $ xinput test 10 tekan tombol 30 pelepasan kunci 30 tekan tombol 40 pelepasan kunci 40 tekan tombol 32 pelepasan kunci 32 tekan tombol 65 pelepasan kunci 65 tekan tombol 61 pelepasan kunci 61 tekan tombol 31 ^ C user @ hostname: ~ $
Saya berharap bahwa output ini seperti biasa dapat disimpan ke file seperti menggunakan xinput test 10 > output.file
. Tetapi ketika bertentangan dengan harapan saya file output.file tetap kosong. Ini juga berlaku untuk xinput test 10 &> output.file
memastikan saya tidak melewatkan sesuatu di stdout atau stderr.
Saya benar-benar bingung dan karenanya bertanya di sini jika xinput
program mungkin memiliki cara untuk menghindari outputnya untuk diarahkan?
memperbarui
Saya telah melihat sumbernya. Tampaknya output dihasilkan oleh kode ini (lihat cuplikan di bawah). Tampaknya bagi saya output akan dihasilkan oleh printf biasa
// dalam file test.c void print_events statis (Tampilan * dpy) { Acara XEvent; sementara (1) { XNextEvent (dpy, & Event); // [... beberapa jenis acara lainnya dihilangkan di sini ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int loop; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Acara; printf ("key% s% d", (Event.type == key_release_type)? "rilis": "tekan", key-> kode kunci); untuk (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]); } printf ("\ n"); } } }
Saya memodifikasi sumber untuk ini (lihat potongan berikutnya di bawah), yang memungkinkan saya untuk memiliki salinan output di stderr. Output ini saya dapat mengarahkan:
// dalam file test.c void print_events statis (Tampilan * dpy) { Acara XEvent; sementara (1) { XNextEvent (dpy, & Event); // [... beberapa jenis acara lainnya dihilangkan di sini ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int loop; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Acara; printf ("key% s% d", (Event.type == key_release_type)? "rilis": "tekan", key-> kode kunci); fprintf (stderr, "key% s% d", (Event.type == key_release_type)? "rilis": "tekan", key-> keycode); untuk (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]); } printf ("\ n"); } } }
Gagasan saya saat ini adalah bahwa mungkin dengan melakukan pengalihan, program kehilangan kemampuannya untuk memantau acara-acara pelepasan kunci.