私はこれを行うのに慣れてきました:
someprogram >output.file
プログラムが生成した出力をファイルに保存するときはいつでも行います。また、このIOリダイレクションの 2つのバリアントも認識しています。
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 user @ hostname:〜$
この出力は、通常のようにファイルに保存できると期待していましたxinput test 10 > output.file。しかし、私の期待に反する場合、ファイルoutput.fileは空のままです。これはxinput test 10 &> output.file、stdoutまたはstderrで何かを見逃さないようにするためにも当てはまります。
私は本当に混乱しているので、xinputプログラムに出力がリダイレクトされるのを避ける方法があるかどうかをここで尋ねますか?
更新
私はソースを見ました。出力はこのコードによって生成されるようです(以下のスニペットを参照)。私には、出力は通常のprintfによって生成されるように見えます
//test.cファイル内
static void print_events(表示* dpy)
{
XEventイベント。
while(1){
XNextEvent(dpy、&Event);
// [...他のいくつかのイベントタイプがここで省略されます...]
if((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": "press"、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ファイル内
static void print_events(表示* dpy)
{
XEventイベント。
while(1){
XNextEvent(dpy、&Event);
// [...他のいくつかのイベントタイプがここで省略されます...]
if((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": "press"、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");
}
}
}
現時点での私の考えは、リダイレクトを行うことにより、プログラムがキーを押すキーリリースイベントを監視する能力を失う可能性があることです。