25

文字列を入力として使用して 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」を呼び出す前に一時スクリプトに書き込むなど、別のアプローチを探す必要がありますか?

4

6 に答える 6

52

これを使って:

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

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

たとえば、echo "Hello, world!"(シェルで入力したとおり) は次のように変換されます。

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

(シェルには通常 for が組み込まれており、代わりにecho呼び出していることを今のところ忘れてください/bin/echo。:-))

于 2008-10-02T11:54:21.960 に答える
10

Windowsのコマンドラインは、UNIX、Mac OS X、GNU/Linuxとは動作が異なります。

Windowsでは、プロセスは実行可能ファイル名(およびスペース)の後に入力テキストをそのまま受け取ります。次に、コマンドラインを解析するのはプログラム次第です(これは通常暗黙的に行われ、プログラマーはプロセスについて無知であることがよくあります)。

mainGNU / Linuxでは、シェルがコマンドラインを処理し、Cの関数に渡される文字列の使い慣れた配列を保証します。あなたはその殻を持っていません。最善のアプローチ(Windowsでも)は、各コマンドライン引数を独自ので個別に渡すexecの形式の1つを使用することですString

Process exec​(String[] cmdarray)    
Process exec​(String[] cmdarray, String[] envp)     
Process exec​(String[] cmdarray, String[] envp, File dir)

またはそれ以上、java.lang.ProcessBuilder

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

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});
于 2008-10-02T14:26:14.793 に答える
4

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

于 2008-10-02T11:45:02.357 に答える
0

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

于 2008-10-02T14:48:29.780 に答える
0

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

例えば

strcpy(c, "これは \"with\" 引用符で囲まれた文字列です");

于 2008-10-02T12:05:34.583 に答える
0

このエラーの原因は、bash が予期する構文トークンが欠落している可能性がありますが、渡す文字列が bash に遭遇する前に終了しています。fi や done が閉じられていない if、for などを探します。

于 2008-10-02T11:47:06.517 に答える