ฉันคุ้นเคยกับการทำสิ่งนี้:
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"); } } }
ความคิดของฉันในปัจจุบันคือการเปลี่ยนเส้นทางโปรแกรมอาจสูญเสียความสามารถในการตรวจสอบกิจกรรมการกดปุ่มกด