WineでWindowsコマンドラインプログラムのstdoutリダイレクト

WineでWindowsコマンドラインプログラムのstdoutリダイレクト

私は Wine を使って Windows コマンドラインプログラム (アクセス権がない) を実行します。明らかに、標準出力に何かを書いていますが、その出力をキャプチャしようとしていますが、リダイレクトできません。

stdoutまたはstderrをファイルにリダイレクトするかどうかにかかわらず、プログラム出力は依然としてコンソールに印刷され、ファイルに書き込まれません。 stderrをリダイレクトするとワイン出力は消えますが、プログラム出力はまだ画面に印刷されます。

wine program.exe > out   # File is empty, program output printed on screen
wine program.exe 2> out  # Wine output gets redirected to file, program output still printed on screen

両方ともリダイレクトすると、出力は画面に印刷されず、ファイルに書き込まれません。

編集する:Windowsでは動作は似ていますが、両方ともリダイレクトすると、すべてがまだ画面に印刷されます。

以下は、完全な出力を含むいくつかの例です。

$ wine program.exe
fixme:winediag:start_process Wine Staging 1.9.23 is a testing version containing experimental patches.
fixme:winediag:start_process Please mention your exact version when filing bug reports on winehq.org.

output by program.exe

fixme:msvcrt:__clean_type_info_names_internal (0x100aaa54) stub

出力をリダイレクトしようとすると、これが発生します。

$ wine program.exe > out 2>&1
$ cat out
fixme:winediag:start_process Wine Staging 1.9.23 is a testing version containing experimental patches.
fixme:winediag:start_process Please mention your exact version when filing bug reports on winehq.org.
fixme:msvcrt:__clean_type_info_names_internal (0x100aaa54) stub

つまり、プログラムのコンソール出力が完全に失われます。プログラムはまだうまく機能し、期待どおりにいくつかのファイルを作成します。確認次元でpngcrushで同じことを行い、期待した結果を得ました。リダイレクトなし:

$ wine pngcrush_1_8_10_w32.exe test.png out.png
fixme:winediag:start_process Wine Staging 1.9.23 is a testing version containing experimental patches.
fixme:winediag:start_process Please mention your exact version when filing bug reports on winehq.org.

 | pngcrush-1.8.10
 |    Copyright (C) 1998-2002, 2006-2016 Glenn Randers-Pehrson
 |    Portions Copyright (C) 2005 Greg Roelofs
 | This is a free, open-source program.  Permission is irrevocably
 | granted to everyone to use this version of pngcrush without
 | payment of any fee.
 | Executable name is pngcrush_1_8_10_w32.exe
 | It was built with   bundled libpng-1.6.26
 | and is running with bundled libpng-1.6.26
 |    Copyright (C) 1998-2004, 2006-2016 Glenn Randers-Pehrson,
 |    Copyright (C) 1996, 1997 Andreas Dilger,
 |    Copyright (C) 1995, Guy Eric Schalnat, Group 42 Inc.,
 | and bundled zlib-1.2.8.1-motley, Copyright (C) 1995 (or later),
 |    Jean-loup Gailly and Mark Adler,
 | and using "clock()".
 | It was compiled with gcc version 4.8.0 20121015 (experimental).

  Recompressing IDAT chunks in test.png to out.png
   Total length of data found in critical chunks            =    431830
   Critical chunk length, method   1 (ws 15 fm 0 zl 4 zs 0) =    495979
   Critical chunk length, method   2 (ws 15 fm 1 zl 4 zs 0) >    495979
   Critical chunk length, method   3 (ws 15 fm 5 zl 4 zs 1) =    495354
   Critical chunk length, method   6 (ws 15 fm 5 zl 9 zs 0) =    457709
   Critical chunk length, method   9 (ws 15 fm 5 zl 2 zs 2) >    457709
   Critical chunk length, method  10 (ws 15 fm 5 zl 9 zs 1) =    451813
   Best pngcrush method        =  10 (ws 15 fm 5 zl 9 zs 1) =    451813
     (4.63% critical chunk increase)
     (4.63% filesize increase)

CPU time decode 4.407583, encode 17.094248, other 4294967296.000000, total 17.180143 sec

リダイレクトの使用:

$ wine pngcrush_1_8_10_w32.exe test.png out.png > out 2>&1
$ cat out
fixme:winediag:start_process Wine Staging 1.9.23 is a testing version containing experimental patches.
fixme:winediag:start_process Please mention your exact version when filing bug reports on winehq.org.

 | pngcrush-1.8.10
 |    Copyright (C) 1998-2002, 2006-2016 Glenn Randers-Pehrson
 |    Portions Copyright (C) 2005 Greg Roelofs
 | This is a free, open-source program.  Permission is irrevocably
 | granted to everyone to use this version of pngcrush without
 | payment of any fee.
 | Executable name is pngcrush_1_8_10_w32.exe
 | It was built with   bundled libpng-1.6.26
 | and is running with bundled libpng-1.6.26
 |    Copyright (C) 1998-2004, 2006-2016 Glenn Randers-Pehrson,
 |    Copyright (C) 1996, 1997 Andreas Dilger,
 |    Copyright (C) 1995, Guy Eric Schalnat, Group 42 Inc.,
 | and bundled zlib-1.2.8.1-motley, Copyright (C) 1995 (or later),
 |    Jean-loup Gailly and Mark Adler,
 | and using "clock()".
 | It was compiled with gcc version 4.8.0 20121015 (experimental).

  Recompressing IDAT chunks in test.png to out.png
   Total length of data found in critical chunks            =    431830
   Critical chunk length, method   1 (ws 15 fm 0 zl 4 zs 0) =    495979
   Critical chunk length, method   2 (ws 15 fm 1 zl 4 zs 0) >    495979
   Critical chunk length, method   3 (ws 15 fm 5 zl 4 zs 1) =    495354
   Critical chunk length, method   6 (ws 15 fm 5 zl 9 zs 0) =    457709
   Critical chunk length, method   9 (ws 15 fm 5 zl 2 zs 2) >    457709
   Critical chunk length, method  10 (ws 15 fm 5 zl 9 zs 1) =    451813
   Best pngcrush method        =  10 (ws 15 fm 5 zl 9 zs 1) =    451813
     (4.63% critical chunk increase)
     (4.63% filesize increase)

CPU time decode 4.339310, encode 17.137527, other 4.294083, total 17.182100 sec

他のプログラムが機能しないのはなぜですか?

ワイン標準出力標準エラーIOリダイレクト

答え1

tmux端末マルチプレクサを使用して標準出力をキャプチャできます。capture-pane

答え2

.batスクリプトを生成してそこからリダイレクトするのはどうですか?

binary.exe args > output.txtそして単に実行wine start script.bat

私は今試しましたが、本当にうまくいきました。

答え3

この質問には欠陥がありますwine program.exe >outいいえ出力リダイレクトprogram.exe- 独自の出力をリダイレクトしますwineこれはprogram.exeの出力と同じでも同じでもないかもしれません。

シェルがコマンドを処理すると、コマンドがwine。また、wineファイルにリダイレクトする出力を探しますout。 (ほとんど)これを無視しますprogram.exe。変数拡張などの場合のみ処理します。しかし、シェルには渡されたテキスト引数だけですwine。また、これを入力することもでき、シェルはそれが実際に存在するかどうかをwine foorbar.exe >out気にしないか確認しません。foorbar.exeシェルはそれを渡し、wineそれでwine何をすべきかを見てみましょう。

シェルはout出力を書き込むためにファイルを開きます(>使用されている場合は切り捨てモード、>>使用されている場合は追加モードで)。その後、シェルはwineバイナリ/実行ファイルを見つけようとします。

見つからない場合は、wineエラーメッセージを印刷し、何も書き込まずにファイルを閉じてからout(空のファイル)、新しいコマンドプロンプトを表示します。

コマンドwine はい一度見つかったら、単一の引数として実行し、program.exe出力wineout。シェルがすでに処理しているため、決して見ることはwineできません。>out

wineこれで、起動して追加の入出力ストリーム(I / O)ストリームを含めたり含めたりしない可能性があるWindowsに似た環境を設定するために必要なすべてのタスクを実行します。それはすべて設定と設定方法によって異なりますwine。これらのストリームは、wine実行前に設定された入力/出力ストリーム(または使用するすべてのシェル)にバインドすることも、バインドすることもできません。bashwine

この時点ではリダイレクトは表示されませんので、検索してwine実行してみてくださいprogram.exewine>outいいえ追加のリダイレクトを設定します。

ご覧のとおり、現在、さまざまなプロセスやファイルに関連するさまざまなI / Oストリームが状況を非常に複雑にしています。

wineconsoleWineには、「CUI」(コンソールモード)プログラムなどの同様の状況を処理するためのさまざまなツール、動作モード、および構成があります。これらのツールを使用し、必要な環境を設定する方法、CUIモードリダイレクトを設定する方法などについては、Wineのドキュメントをお読みください。

ここに答えを投稿するには、これはすべて複雑すぎます。文書を読んで自分で理解するように努力し、問題が発生した場合は、より具体的な質問と詳細を投稿する必要があります。

したがって、この回答の「tl;dr」バージョンは次のようになります。このサイトの範囲と目的を超えているため、ここに投稿できる回答はありません。元の質問があまりにも多く提起されました。間違ったシステム全体がどのように機能するかについての仮説。

関連情報