getRuntime()。exec内で引用符を使用する
-
03-07-2019 - |
質問
入力として文字列を使用して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がエラーなしでそれを実行するかどうかを確認します。エラーなしで実行される場合、さらにデバッグすることを検討します;