WINEを使用してLinux上で実行されているWindowsプログラムがあります。
WindowsプログラムからLinuxシェルコマンドを呼び出すにはどうすればよいですか?
新しいバージョンのWine (Wine 1.7.38でテスト済み)では、次の方法でWine内からLinuxプログラムを実行できます(例として、ここではgeditを起動します)。
wineconsole cmd
...そしてそのワインコンソールから:
start /unix /usr/bin/gedit
Windowsアプリケーション内から直接Linuxプログラムを起動したい場合は、次の行が機能しました。
cmd /c start /unix /usr/bin/gedit
これをテストするには、Linuxコンソールで次のコマンドを直接呼び出すことができます。
wine cmd /c start /unix /usr/bin/gedit
注意すべき重要な点の1つは、起動するプログラムに実行可能ビットを設定する必要があります。そうしないと、Wineから呼び出すことができなくなります。
これを試してください(私のLinux MintシステムでGnome計算機を実行します):
wineconsole cmd
...そしてワインコンソールから:
/bin/sh gcalctool
この一般原則に基づいて、wineレジストリを編集することにより、ドキュメントを開いてファイルをLinuxアプリに関連付けることもできます。ワインに関するFAQにそれに関するセクションがあります:
6.6.3ネイティブプログラムをWineのファイルタイプに関連付けるにはどうすればよいですか?
したがって、シェルスクリプトを記述して、それらをOKと呼ぶことができるはずです。
試してみてください(yourprogramはwineで実行したいlinux / unixプログラムです)
ln -s /path/to/yourprogram /path/to/wineprefix/drive_c/windows/system32/yourprogram
それが私がJavaを機能させる方法です。
WineプログラムからLinuxプログラムを呼び出す方法—APIに関して5つのポイント。
PATHEXT
新しいWineバージョン(少なくとも2.0.1以降)では、環境変数の実行可能ファイル拡張子のリストに空の拡張子(つまり、ドット文字:)を追加する必要があります。この追加がないと、エラーメッセージは次のようになります。.
PATHEXT
Can't recognize '/bin/bash' as an internal or external command, or batch script.
レジストリの初期値を修正するには、次のコマンドスニペットを(それぞれに対して)PATHEXT
使用できます。WINEPREFIX
k='HKLM\System\CurrentControlSet\Control\Session Manager\Environment'
pathext_orig=$( wine reg query "$k" /v PATHEXT | tr -d '\r' | awk '/^ /{ print $3 }' )
echo "$pathext_orig" | grep -qE '(^|;)\.(;|$)' \
|| wine reg add "$k" /v PATHEXT /f /d "${pathext_orig};."
このコードは、アイテムのみPATHEXT
が含まれていないかどうかを確認して変更します。.
参照:Windowsアプリケーションからネイティブアプリケーションを起動するにはどうすればよいですか?WineHQFAQで; 注意:
この変更は、Wineをアップグレードするたびに行う必要があることに注意してください。これは、wineprefixが更新されるたびに元に戻されるためです。
Wineプロセスは親Linuxプロセスから環境変数を/bin/bash
継承しないため、デフォルトでは、実行可能ファイル(たとえば)へのフル(または相対)パスを指定する必要があります。PATH
Wineプロセスの現在のドライブはデフォルトでLinuxルートフォルダーにマップされるため、ドライブ文字を指定する必要はありません。つまり/bin/bash
、機能しますが、機能しませんbash
。
別の方法はPATH
、それに応じてWineの環境変数を変更するか、現在のディレクトリを変更することです。
パスにASCII以外の文字が含まれている場合は常に(の引数としてCreateProcessA
)、パスはWineロケールであり、LANG
環境変数に従う必要があります。このトピックのEugeneによる回答、およびWineの非Unicodeアプリケーションで使用するエンコードを設定する方法に関するフォーラム投稿も参照してください。いずれの場合CreateProcessW
も、パスはUTF-16である必要があります。
共有オブジェクト形式のLinux実行可能ファイルはWineから実行できません。参照:実行可能ファイルと共有オブジェクト、および64ビットLinuxで32ビットWineからシェルスクリプトを実行する方法。たとえば、/bin/dash
「ELF 64ビットLSB共有オブジェクト」(の出力を参照file /bin/dash
)にすることができ、そのような場合はWineから実行できません。エラーメッセージは次のとおりです。
wine: Bad EXE format for Z:\bin\dash..
Can't recognize '/bin/dash' as an internal or external command, or batch script.
WaitForSingleObject
親Wineプロセスは、子プロセスハンドルが提供されていないため(たとえば、経由で)待機できません。これは0です。バグレポートを参照してください: Linuxプログラムの起動時にCreateProcessがhProcessを正しく設定しません(ステータス:CLOSED WONTFIX)。
それでも、子プロセスがstdoutを使用している場合、親プロセスは特定のパイプでの読み取りをブロックすることにより、子プロセスを間接的に待機できます(以下も参照)。
おそらくこれはWineのバグですが、親プロセスは、対応するパイプの独自のハンドルを閉じた後(またはその直前)にのみ、CreateProcessに渡されるstdハンドルを閉じる必要があります。CreateProcess
Windowsでは、これらのハンドルは機能が完了した直後に閉じることができます。MSDNにより、これらのハンドルは、渡された後にすぐに閉じることができます(CreateProcess関数を参照)。
STARTUPINFOまたはSTARTUPINFOEXのハンドルは、不要になったときにCloseHandleで閉じる必要があります。
Wine 2.0.1では、このような場合、子Linuxプロセスの対応するパイプはすぐに閉じられ、子プロセスは途中で停止します。ただし、子Windowsプロセスの場合はそうではありません。
例えば:
Z:\bin\ls
しかし、ワインの「ウィンドウ」にインストールするhttp://gnuwin32.sourceforge.net/のようなものを探しているのではないでしょうか。または、すでに述べたcygwin。
私にとって、このサイトで最初に見つけた解決策は機能しました。拡張機能をwinebrowserに関連付けると、wine explorer(または他のWindowsアプリケーション)でファイルをクリックすると、デフォルトのgnomeファイルビューアがwineから起動します。
wine 1.4で機能していたシェルスクリプトを使用した以前のソリューションは、wine1.6では機能しません。
ただし、私が気付いた問題は、Windowsエンコーディングの名前がLinuxロケールに変換されないため、ロシア語のディレクトリ名などで機能しないことです。
編集:user1182474のコメントは正しいです。Wineは、実行するプログラムを分離しません。(それはそれを隠そうとしますが、完全ではありません。)私はグーグルを使うことに完全に失敗しました。以下のPsenのコメントはより正確であり、FAQを参照しています。(これを機能させるには、Wineドライブマッピングを介してプログラムのディレクトリを使用できるようにする必要がある場合があります。または、Anonymous Replierの回答を参照してください。)
==古い答え==
Wineは、実行するプログラムを分離します。アプリケーションは、すべてが意図したとおりに機能する場合、Windowsと区別がつかない環境で提供されます。残念ながら、あなたの目的のために、それはあなたがホストOS(Linux)の機能にアクセスできないことを意味します。つまり、Wineにパッチを適用してそれを行うことはできますが、それは価値があるよりも多くの作業になるだろうという印象を受けます。
希望がある!Cygwinは、Windows用のUnixライクな環境です。CygwinをWineにインストールし、Cygwinを使用してシェルスクリプトを実行できます。(どうやら、「winetricks cygwin」を使用してインストールするのが最も簡単です)次のようにCygwinのbashシェル(一部のWineプログラム内)を呼び出します。
c:\cygwin\bin\bash myscript
もちろん、c:\cygwinをインストールする場所に変更します。
WineHQ FAQにリストされているシェルスクリプトは、次のように少し変更できます。
#!/bin/bash
WFILE=$(echo -E $2)
FILE=$(wine winepath $WFILE)
$1 $FILE
残りはFAQで説明されているように機能します。
私はワインの下で実行されるFarCommanderが大好きなので、次の2つのスクリプトを設定しました。
C:\ windows \ xt.bat
start /unix /usr/bin/xterm -e %*
C:\ windows \ xdg.bat
cd >C:\windows\command\mypwd
start /unix /etc/init.d/winopen.sh %*
/etc/init.d/winopen.sh
#!/bin/sh
PWDF=`winepath -u 'C:\windows\command\mypwd'`
fromdos $PWDF
xdg-open $(winepath -u $(cat $PWDF)/$1)
これで、Farコマンドラインで入力できます。
xtトップ
xdg SomeDocument.PDF
Linux環境で結果を取得します。
コマンドが完了して出力を取得するのを待つ必要がある場合は、SSHを使用してください。それ以外の場合(開始するだけでよい場合)、次のいずれかの方法が機能します。
主要な問題は、CreateProcessがゼロのPIDとハンドルを返すため、子プロセスの完了を待って終了コードを取得できないことです。
私はまた、運が悪かった標準的なパイプのリダイレクトを試しました。Linuxの子プロセスの出力が失われ、パイプが空になります。
したがって、CreateProcessやその仲間と一緒に、ある種のトリガーファイルを使用する必要がありますが、これはあまり美しくはありません。私が言ったように、代わりにSSHを使用します。