我已经习惯了这样做:
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事件; while(1){ XNextEvent(dpy,&Event); // [...此处省略了其他一些事件类型...] 如果((Event.type == key_press_type)|| (Event.type == key_release_type)){ int循环; XDeviceKeyEvent * key =(XDeviceKeyEvent *)&Event; printf(“ 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 [loop]); } printf(“ \ n”); } } }
我对此进行了修改(请参见下面的下一个代码片段),这使我可以在stderr上复制输出。我可以重定向此输出:
//在文件test.c中 静态无效print_events(Display * dpy) { XEvent事件; while(1){ XNextEvent(dpy,&Event); // [...此处省略了其他一些事件类型...] 如果((Event.type == key_press_type)|| (Event.type == key_release_type)){ int循环; XDeviceKeyEvent * key =(XDeviceKeyEvent *)&Event; printf(“ key%s%d”,(Event.type == key_release_type)?“ release”:“按”,key-> keycode); fprintf(stderr,“ key%s%d”,(Event.type == key_release_type)?“ release”:“ press”,key-> keycode); for(loop = 0; loopaxes_count; loop ++){ printf(“ a [%d] =%d”,key-> first_axis + loop,key-> axis_data [loop]); } printf(“ \ n”); } } }
目前,我的想法是,也许通过执行重定向程序会失去监视按键释放事件的能力。