web-dev-qa-db-ja.com

Java Linuxで複数のコマンドを順番に実行し始めるProcessBuilder

ProcessBuilderクラスを使用してJavaアプリケーションを介して2つ以上のコマンドを順番に実行したい。他の応答/フォーラムで提案されているように複数のオプションを試しましたが、うまくいきませんでした。

これが私が試したことです:

    ProcessBuilder processBuilder = new ProcessBuilder("ls", ";", "pwd");

次のエラーが発生します:

エラー:ls:;:そのようなファイルまたはディレクトリはありませんエラー:ls:pwd:そのようなファイルまたはディレクトリはありません

    ProcessBuilder processBuilder = new ProcessBuilder("ls", "&&", "pwd");

同様のエラーが発生します:

エラー:ls:&&:そのようなファイルまたはディレクトリはありませんエラー:ls:pwd:そのようなファイルまたはディレクトリはありません

    List<String> command = new ArrayList<String>();
    command.add("ls");
    command.add(";");
    command.add("pwd");
    ProcessBuilder processBuilder = new ProcessBuilder(command);

次のエラーが発生します:

エラー:ls:;:そのようなファイルまたはディレクトリはありませんエラー:ls:pwd:そのようなファイルまたはディレクトリはありません

私のOSはLinux/Mac-OSXです。

16
Narinder Kumar

あなたのアプローチは、指定された引数でlsを呼び出すことと同じです。 Bash表記では、実行しているのは次のとおりです。

ls ';' pwd
ls '&&' pwd

lspwdを別々のコマンドとして実行する場合は、Bash(または別のシェル言語)を使用して、それらを1つのコマンドにラップできます。

bash -c 'ls ; pwd'

あなたはこのように呼ぶことができます:

ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", "ls ; pwd");
24
ruakh

私はProcessBuilderを使用してJavaプログラムをこのようにコンパイルしていますが、これで動作します:

ProcessBuilder b = new ProcessBuilder("cmd.exe","/c","cd " + dir,
            " & javac " + mapClassName + ".Java -cp " + pathToProjectClasses);
  • cmd.exe:コマンドプロンプトを開始します。
  • \ c:何をしているのかわかりませんが、重要です。詳細については、このリンクを参照してください (\?cmdコマンド)
  • cd + dir:は最初のコマンドであり、ディレクトリをdirである特定のパスに変更します。
  • &:最初のコマンドを終了した後、2番目のコマンドを開始することを意味します
  • javac:この単語と文字列の残りの部分は2番目のコマンドです
  • -cp:コンパイルするクラスが使用する外部クラスへのパス。

したがって、2つのコマンドがあります。最初のコマンドはcdコマンドで、2番目のコマンドはjavacコマンドで、&を使用して順番に実行します。

私の悪いライティングスキルで申し訳ありませんが、私のコードをうまく説明していない場合は、知りたいことについて私に尋ねてください。

2
Rawhe Rawhe

最初のコマンドから ProcessBuilder.start() からプロセスを取得し、 waitFor() を使用して待機してから、2番目のコマンドを起動できます。

1
Denys Séguret