私は 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
出力wine
をout
。シェルがすでに処理しているため、決して見ることはwine
できません。>out
wine
これで、起動して追加の入出力ストリーム(I / O)ストリームを含めたり含めたりしない可能性があるWindowsに似た環境を設定するために必要なすべてのタスクを実行します。それはすべて設定と設定方法によって異なりますwine
。これらのストリームは、wine
実行前に設定された入力/出力ストリーム(または使用するすべてのシェル)にバインドすることも、バインドすることもできません。bash
wine
この時点ではリダイレクトは表示されませんので、検索してwine
実行してみてくださいprogram.exe
。wine
>out
いいえ追加のリダイレクトを設定します。
ご覧のとおり、現在、さまざまなプロセスやファイルに関連するさまざまなI / Oストリームが状況を非常に複雑にしています。
wineconsole
Wineには、「CUI」(コンソールモード)プログラムなどの同様の状況を処理するためのさまざまなツール、動作モード、および構成があります。これらのツールを使用し、必要な環境を設定する方法、CUIモードリダイレクトを設定する方法などについては、Wineのドキュメントをお読みください。
ここに答えを投稿するには、これはすべて複雑すぎます。文書を読んで自分で理解するように努力し、問題が発生した場合は、より具体的な質問と詳細を投稿する必要があります。
したがって、この回答の「tl;dr」バージョンは次のようになります。このサイトの範囲と目的を超えているため、ここに投稿できる回答はありません。元の質問があまりにも多く提起されました。間違ったシステム全体がどのように機能するかについての仮説。