19

WINEを使用してLinux上で実行されているWindowsプログラムがあります。

WindowsプログラムからLinuxシェルコマンドを呼び出すにはどうすればよいですか?

4

10 に答える 10

12

新しいバージョンの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から呼び出すことができなくなります。

于 2015-04-14T16:19:33.500 に答える
10

これを試してください(私のLinux MintシステムでGnome計算機を実行します):

wineconsole cmd

...そしてワインコンソールから:

/bin/sh gcalctool

この一般原則に基づいて、wineレジストリを編集することにより、ドキュメントを開いてファイルをLinuxアプリに関連付けることもできます。ワインに関するFAQにそれに関するセクションがあります:

6.6.3ネイティブプログラムをWineのファイルタイプに関連付けるにはどうすればよいですか?

したがって、シェルスクリプトを記述して、それらをOKと呼ぶことができるはずです。

于 2011-11-20T22:42:49.220 に答える
4

試してみてください(yourprogramはwineで実行したいlinux / unixプログラムです)

ln -s /path/to/yourprogram /path/to/wineprefix/drive_c/windows/system32/yourprogram

それが私がJavaを機能させる方法です。

于 2012-04-01T20:59:39.310 に答える
4

WineプログラムからLinuxプログラムを呼び出す方法—APIに関して5つのポイント。

1.適切な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が更新されるたびに元に戻されるためです。

2.実行可能ファイルへのパス

Wineプロセスは親Linuxプロセスから環境変数を/bin/bash継承しないため、デフォルトでは、実行可能ファイル(たとえば)へのフル(または相対)パスを指定する必要があります。PATHWineプロセスの現在のドライブはデフォルトでLinuxルートフォルダーにマップされるため、ドライブ文字を指定する必要はありません。つまり/bin/bash、機能しますが、機能しませんbash

別の方法はPATH、それに応じてWineの環境変数を変更するか、現在のディレクトリを変更することです。

パスにASCII以外の文字が含まれている場合は常に(の引数としてCreateProcessA)、パスはWineロケールであり、LANG環境変数に従う必要があります。このトピックのEugeneによる回答、およびWineの非Unicodeアプリケーションで使用するエンコードを設定する方法に関するフォーラム投稿も参照してください。いずれの場合CreateProcessWも、パスはUTF-16である必要があります。

3.実行可能フォーマット

共有オブジェクト形式の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.

4.待つ必要はありません

WaitForSingleObject親Wineプロセスは、子プロセスハンドルが提供されていないため(たとえば、経由で)待機できません。これは0です。バグレポートを参照してください: Linuxプログラムの起動時にCreateProcessがhProcessを正しく設定しません(ステータス:CLOSED WONTFIX)。

それでも、子プロセスがstdoutを使用している場合、親プロセスは特定のパイプでの読み取りをブロックすることにより、子プロセスを間接的に待機できます(以下も参照)。

5.パイプのリダイレクトの違い

おそらくこれはWineのバグですが、親プロセスは、対応するパイプの独自のハンドルを閉じた後(またはその直前)にのみ、CreateProcessに渡されるstdハンドルを閉じる必要があります。CreateProcessWindowsでは、これらのハンドルは機能が完了した直後に閉じることができます。MSDNにより、これらのハンドルは、渡された後にすぐに閉じることができます(CreateProcess関数を参照)。

STARTUPINFOまたはSTARTUPINFOEXのハンドルは、不要になったときにCloseHandleで閉じる必要があります。

Wine 2.0.1では、このような場合、子Linuxプロセスの対応するパイプはすぐに閉じられ、子プロセスは途中で停止します。ただし、子Windowsプロセスの場合はそうではありません。

于 2017-08-07T10:47:02.583 に答える
2

例えば:

Z:\bin\ls

しかし、ワインの「ウィンドウ」にインストールするhttp://gnuwin32.sourceforge.net/のようなものを探しているのではないでしょうか。または、すでに述べたcygwin。

于 2013-01-23T14:05:39.323 に答える
2

私にとって、このサイトで最初に見つけた解決策は機能しました。拡張機能をwinebrowserに関連付けると、wine explorer(または他のWindowsアプリケーション)でファイルをクリックすると、デフォルトのgnomeファイルビューアがwineから起動します。

wine 1.4で機能していたシェルスクリプトを使用した以前のソリューションは、wine1.6では機能しません

ただし、私が気付いた問題は、Windowsエンコーディングの名前がLinuxロケールに変換されないため、ロシア語のディレクトリ名などで機能しないことです。

于 2014-05-07T17:09:47.603 に答える
0

編集: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をインストールする場所に変更します。

于 2011-05-15T05:12:06.363 に答える
0

WineHQ FAQにリストされているシェルスクリプトは、次のように少し変更できます。

#!/bin/bash
WFILE=$(echo -E $2)
FILE=$(wine winepath $WFILE)
$1 $FILE

残りはFAQで説明されているように機能します。

于 2014-11-27T00:53:08.517 に答える
0

私はワインの下で実行されるFarCommanderが大好きなので、次の2つのスクリプトを設定しました。

  1. WindowsからLinuxアプリケーションを起動するには

C:\ windows \ xt.bat

start /unix /usr/bin/xterm -e %*
  1. ワイン環境(Far)からLinuxでファイルを開くには:

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環境で結果を取得します。

于 2017-04-05T10:05:39.257 に答える
0

コマンドが完了して出力を取得するのを待つ必要がある場合は、SSHを使用してください。それ以外の場合(開始するだけでよい場合)、次のいずれかの方法が機能します。

主要な問題は、CreateProcessがゼロのPIDとハンドルを返すため、子プロセスの完了を待って終了コードを取得できないことです。

私はまた、運が悪かった標準的なパイプのリダイレクトを試しました。Linuxの子プロセスの出力が失われ、パイプが空になります。

したがって、CreateProcessやその仲間と一緒に、ある種のトリガーファイルを使用する必要がありますが、これはあまり美しくはありません。私が言ったように、代わりにSSHを使用します。

于 2020-10-30T04:23:03.153 に答える