Tôi đã trở nên quá quen với việc này:
someprogram >output.file
Tôi làm điều đó bất cứ khi nào tôi muốn lưu kết quả mà chương trình tạo ra vào một tệp. Tôi cũng nhận thức được hai biến thể của chuyển hướng IO này :
someprogram 2>output.of.stderr.file
(đối với thiết bị lỗi thời)someprogram &>output.stderr.and.stdout.file
(cho cả stdout + stderr kết hợp)
Hôm nay tôi đã chạy qua một tình huống mà tôi không nghĩ là có thể. Tôi sử dụng lệnh sau xinput test 10
và như mong đợi, tôi có đầu ra sau:
tên người dùng @ tên máy chủ: ~ $ xinput test 10 nhấn phím 30 phát hành khóa 30 nhấn phím 40 phát hành khóa 40 nhấn phím 32 phát hành khóa 32 nhấn phím 65 phát hành khóa 65 nhấn phím 61 phát hành khóa 61 nhấn phím 31 ^ C tên người dùng @ tên: ~ $
Tôi hy vọng rằng đầu ra này có thể được lưu vào một tập tin như sử dụng xinput test 10 > output.file
. Nhưng khi trái với dự đoán của tôi, tệp output.file vẫn trống. Điều này cũng đúng vì xinput test 10 &> output.file
chỉ để đảm bảo rằng tôi không bỏ lỡ điều gì trên thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn.
Tôi thực sự bối rối và do đó hỏi ở đây liệu xinput
chương trình có thể có cách nào để tránh đầu ra của nó bị chuyển hướng không?
cập nhật
Tôi đã xem nguồn. Có vẻ như đầu ra được tạo bởi mã này (xem đoạn trích bên dưới). Nó xuất hiện với tôi đầu ra sẽ được tạo ra bởi một printf thông thường
// trong tệp test.c void void print_events (Hiển thị * dpy) { Sự kiện XEvent; trong khi (1) { XNextEvent (dpy, & Sự kiện); // [... một số loại sự kiện khác được bỏ qua ở đây ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { vòng lặp int; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Sự kiện; printf ("key% s% d", (Event.type == key_release_type)? "phát hành": "nhấn", key-> keycode); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> ax_data [loop]); } printf ("\ n"); } } }
Tôi đã sửa đổi nguồn này (xem đoạn trích tiếp theo bên dưới), cho phép tôi có một bản sao của đầu ra trên stderr. Đầu ra này tôi có thể chuyển hướng:
// trong tệp test.c void void print_events (Hiển thị * dpy) { Sự kiện XEvent; trong khi (1) { XNextEvent (dpy, & Sự kiện); // [... một số loại sự kiện khác được bỏ qua ở đây ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { vòng lặp int; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Sự kiện; printf ("key% s% d", (Event.type == key_release_type)? "phát hành": "nhấn", key-> keycode); fprintf (stderr, "key% s% d", (Event.type == key_release_type)? "phát hành": "nhấn", key-> keycode); for (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + loop, key-> ax_data [loop]); } printf ("\ n"); } } }
Ý tưởng của tôi hiện tại là có thể bằng cách thực hiện chuyển hướng, chương trình mất khả năng giám sát các sự kiện phát hành phím bấm phím.