2

Linuxで実行しようとしています:

command[0] = "~/test/bin/runScript_sh";
Runtime.getRuntime().exec(command);

しかし、例外を取得しますjava.io.IOException:プログラム
error = 2を実行できません、そのようなファイルまたはディレクトリはありません

チルダを評価できないためか。

何ができる?

4

4 に答える 4

4

自分で交換します。

if(path.s.substring(0,1).contains("~"))
    path = path.replaceFirst("~",System.getProperty("user.home"));

これで、必要な文字列が得られます。

于 2013-03-07T14:21:51.640 に答える
2

次のコマンドでユーザーのホームディレクトリを取得できますSystem.getProperty

command[0] = System.getProperty("user.home") + "/test/bin/runScript_sh";
于 2013-03-07T14:22:16.167 に答える
2

シェルコマンドプロンプトでコマンドを実行すると、~展開、見積もり処理、グロブ、$ variable展開、入力/出力リダイレクト、配管などがすべてシェルによって処理されます...オペレーティングシステムに実行を要求する前にあなたのためのプログラム。

を使用してコマンドを実行する場合、次のRuntime.exec3つの選択肢があります。

  • シェルなしでコマンドを書く「ファンキーなもの」
  • シェルがJavaで行うことを複製します。たとえば、先頭のチルダを適切なものに置き換えます1、または
  • execを使用して子シェルを起動し、コマンドを実行します。例えば

    Runtime.getRuntime().exec("/bin/sh", "-c", "~/test/bin/runScript_sh");
    

    このような単純なケースでは、それはおそらくやり過ぎです。しかし、もっと複雑なことをしようとしているのなら、子シェルは本当に物事を単純化することができます。


1-実際、完全にシェル互換のチルダの処理はかなり複雑です。

于 2013-03-07T15:11:56.533 に答える
1

~やなどのアイテム$HOMEはシェル拡張です

プログラムでこれらのアイテムを展開してから置き換える必要があります(ヒント:osプロパティから取得します。このページを参照してください) 。

于 2013-03-07T14:20:47.523 に答える