ฉันคุ้นเคยกับการทำสิ่งนี้:
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 ทดสอบ 10 กดปุ่ม 30 การปลดล็อคกุญแจ 30 กดปุ่ม 40 การปลดล็อคกุญแจ 40 กดปุ่ม 32 การปลดล็อคกุญแจ 32 กดปุ่ม 65 การปลดล็อคกุญแจ 65 กดปุ่ม 61 ปล่อยกุญแจ 61 กดปุ่ม 31 ^ C ผู้ใช้ @ ชื่อโฮสต์: ~ $
ฉันคาดว่าเอาต์พุตนี้จะสามารถบันทึกเป็นไฟล์แบบxinput test 10 > output.fileปกติได้ แต่เมื่อขัดกับความคาดหวังของฉันไฟล์ output.file ยังคงว่างเปล่า นี่ก็เป็นจริงxinput test 10 &> output.fileเช่นกันเพื่อให้แน่ใจว่าฉันจะไม่พลาดบางสิ่งบางอย่างใน stdout หรือ stderr
ฉันสับสนจริงๆและด้วยเหตุนี้จึงถามที่นี่ว่าxinputโปรแกรมอาจมีวิธีหลีกเลี่ยงการเปลี่ยนเส้นทางผลลัพธ์หรือไม่
ปรับปรุง
ฉันได้ดูที่แหล่งที่มา ดูเหมือนว่าผลลัพธ์จะถูกสร้างโดยรหัสนี้ (ดูตัวอย่างด้านล่าง) ดูเหมือนว่าฉันจะสร้างผลลัพธ์โดย printf สามัญ
// ในไฟล์ test.c
โมฆะคงที่ print_events (Display * dpy)
{
เหตุการณ์ XEvent;
ในขณะที่ (1) {
XNextEvent (dpy, & Event);
// [... มีการละเว้นประเภทกิจกรรมอื่น ๆ ที่นี่ ... ]
if ((Event.type == key_press_type) ||
(Event.type == key_release_type)) {
int ลูป;
XDeviceKeyEvent * key = (XDeviceKeyEvent *) & กิจกรรม;
printf ("key% s% d", (Event.type == key_release_type)? "release": "กด", key-> keycode);
สำหรับ (loop = 0; loopaxes_count; loop ++) {
printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]);
}
printf ( "\ n");
}
}
}
ฉันแก้ไขซอร์สโค้ดเป็นแบบนี้ (ดูตัวอย่างถัดไปด้านล่าง) ซึ่งอนุญาตให้ฉันมีสำเนาของเอาต์พุตบน stderr ผลลัพธ์นี้ฉันสามารถเปลี่ยนเส้นทางได้:
// ในไฟล์ test.c
โมฆะคงที่ print_events (Display * dpy)
{
เหตุการณ์ XEvent;
ในขณะที่ (1) {
XNextEvent (dpy, & Event);
// [... มีการละเว้นประเภทกิจกรรมอื่น ๆ ที่นี่ ... ]
if ((Event.type == key_press_type) ||
(Event.type == key_release_type)) {
int ลูป;
XDeviceKeyEvent * key = (XDeviceKeyEvent *) & กิจกรรม;
printf ("key% s% d", (Event.type == key_release_type)? "release": "กด", key-> keycode);
fprintf (stderr, "key% s% d", (Event.type == key_release_type)? "release": "กด", key-> keycode>;
สำหรับ (loop = 0; loopaxes_count; loop ++) {
printf ("a [% d] =% d", key-> first_axis + loop, key-> axis_data [loop]);
}
printf ( "\ n");
}
}
}
ความคิดของฉันในปัจจุบันคือการเปลี่ยนเส้นทางโปรแกรมอาจสูญเสียความสามารถในการตรวจสอบกิจกรรมการกดปุ่มกด