0

シェルコマンドを呼び出すプログラムがあります。Javaのrun.execを使用してコマンドを実行すると機能しませんが、ターミナルで直接コマンドを実行すると魅力的に機能します。

ex: pdf2swf "3bbba47.pdf" -T 9 -o "3bbba47.swf" didnt worked
    from java program but worked directly executing it in terminal.

しかし、コマンドから引用符を削除しようとしたとき

pdf2swf 3bbba47.pdf -T 9 -o 3bbba47.swf

run.exec とターミナルの両方で問題なく動作しました。

なぜそうなのですか?

Macとubuntuの両方で試しましたが、同じ結果で終了しました。

4

3 に答える 3

2

run.exec() はシェルを呼び出しません。シェルはコマンド ラインを解析し、引数として pdf2swf に渡す前に引用符を効果的に削除します。run.exec() で実行できるのは「生の」コマンドのみです。

必要に応じて、run.exec() を使用してシェルを実行し、コマンドをシェル コマンドとして解析させることができます。引用は少し面倒ですが、実行可能です。

于 2009-11-14T07:36:58.077 に答える
1

シェルを使用している場合、シェルが JVM に渡す前に引用符が解釈されます。

run.exec では、引用符はコマンドの一部と見なされるため、JVM は、[3bbba47.pdf] ではなく ["3bbba47.pdf"] を要求すると認識します。

于 2009-11-14T07:39:57.790 に答える
0

出典: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

Runtime.exec() はコマンドラインではありません

Runtime.exec() でカバーすべき最後の落とし穴は、exec() がコマンド ライン (またはシェル) が受け入れる任意の文字列を受け入れると誤って想定していることです。Runtime.exec() ははるかに制限されており、クロスプラットフォームではありません。この落とし穴は、ユーザーが exec() メソッドを使用して、コマンド ラインのように単一の文字列を受け入れようとすることによって発生します。この混乱は、command が exec() メソッドのパラメーター名であることが原因である可能性があります。したがって、プログラマは、パラメータ コマンドを、1 つのプログラムとその引数に関連付けるのではなく、コマンド ラインに入力できるものと誤って関連付けます。

于 2009-11-14T08:47:49.667 に答える