質問

入力として文字列を使用してbashを起動します。次のようなもの:

sh -l -c "./foo"

Javaからこれを行いたいです。残念ながら、 getRuntime()。exec を使用してコマンドを呼び出そうとすると、次のエラーが表示されます。

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

これは、EOFで終了していない文字列に関連しているようです。

プラットフォーム固有のEOFをJava文字列に挿入する方法はありますか?または、「sh」を呼び出す前に一時スクリプトに書き込むなど、別のアプローチを探している必要があります。

役に立ちましたか?

解決

これを使用:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

要点:二重引用符を入れないでください。これは、シェルでコマンドラインを記述するときにのみ使用されます!

e.g。、 echo" Hello、world!" (シェルで入力したとおり)は次のように翻訳されます:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(シェルには通常 echo のビルトインがあり、代わりに / bin / echo を呼び出していることを忘れてください。:-))

他のヒント

Windowsコマンドラインは、UNIX、Mac OS X、およびGNU / Linuxとは異なります。

Windowsでは、プロセスは実行可能な名前(およびスペース)の後に入力テキストをそのまま受け取ります。コマンドラインを解析するのはプログラム次第です(通常は暗黙的に行われ、プログラマーはしばしば無知です)。

GNU / Linuxでは、シェルはコマンドラインを処理し、Cのメインに渡されるおなじみの文字列の配列を認識します。そのシェルはありません。最良のアプローチは(Windowsでも)execの形式を使用して、各コマンドライン引数を独自の文字列で個別に渡すことです。

本当に必要な場合は、解析用のシェルを入手できます。これにより、例は次のようになります(テストなし):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});

EOFは文字ではないため、EOFを記述する方法はありません。 引用符で囲まれた文字列を閉じるのを忘れました。

このエラーの原因は、bashが期待する構文トークンの欠落である可能性が高いですが、渡した文字列はbashに遭遇する前に終了します。終了fiまたはdoneがないif、forsなどを探します。

文字列内の引用符はエスケープする必要があります。 "と書く代わりに\"を書きます。

E.g。

strcpy(c、"これは文字列です\" with \" quotes");

私があなたなら、文字列の内容を一時bashファイルに書き込み、bashがエラーなしでそれを実行するかどうかを確認します。エラーなしで実行される場合、さらにデバッグすることを検討します;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top