2016-08-25 19 views
1

Javaプログラムを端末から実行していて、コード内でlinuxコマンドを使用して特定のディレクトリにあるファイルの数を数えようとしています。私は他のすべてのコマンドの出力を得ましたが、これは1つです。Javaプログラムが端末から出力されない

私のコマンドは次のとおりです。ls somePath/*.xml | wc -l

私は私のコードで私のコマンドを実行すると、出力に何も持っていないように見える、まだ私は、端末にまったく同じコマンドを実行すると、それだけで正常に動作し、実際に番号を出力そのディレクトリ内のxmlファイルのここで

が私のコードです:出力

private String executeTerminalCommand(String command) { 
     String s, lastOutput = ""; 
     try { 
      Process p = new ProcessBuilder().command("/bin/bash", "-c", command).inheritIO().start();   
      //Process p = Runtime.getRuntime().exec(command); 
      BufferedReader br = new BufferedReader(
        new InputStreamReader(p.getInputStream())); 
      System.out.println("Executing command: " + command); 
      while ((s = br.readLine()) != null){ 
       System.out.println("OUTPUT: " + s); 
       lastOutput = s; 
      } 
      System.out.println("Done with command------------------------"); 
      p.waitFor(); 
      p.destroy(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("LAST OUTPUT IS: " + lastOutput); 
     return lastOutput; 
    } 

出力/ W

private String executeTerminalCommand(String command) { 
    String s, lastOutput = ""; 
    Process p; 
    try { 
     p = Runtime.getRuntime().exec(command); 
     BufferedReader br = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     System.out.println("Executing command: " + command); 
     while ((s = br.readLine()) != null){//it appears that it never enters this loop since I never see anything outputted 
      System.out.println(s); 
      lastOutput = s; 
     } 
     p.waitFor(); 
     p.destroy(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return lastOutput;//returns empty string "" 
} 

更新コード:パイプラインを実行するには

Executing command: find my/path -empty -type f | wc -l 
Done with command------------------------ 
1 
LAST OUTPUT IS: 
+0

Runtime上で多分(真ProcessBuilderをを使用し、 'pb.redirectErrorStreamをやってみてください); ' –

+0

次のコマンドを試してください:' Process p = new ProcessBuilder()。command( "bash"、 "-c"、 "ls somePath/*。xml | wc -l")inheritIO()。start(); ' –

+0

皆さん、ありがとうございますnatelyそれらは私のために働かなかった。 –

答えて

2

、あなたはシェルを起動する必要がありますそのシェルの中でコマンドを実行します。

Process p = new ProcessBuilder().command("bash", "-c", command).start(); 

bashはあなたのコマンドを実行するシェルを呼び出し、-cは、コマンドは、文字列から読み取るされることを意味します。したがって、ProcessBuilderに配列としてコマンドを送信する必要はありません。

しかし、あなたはその後、

String[] cmd = {"bash" , "-c" , command}; 
Process p = Runtime.getRuntime().exec(cmd); 

Runtimeを使用する場合:あなたがProcessBuilderhereの利点を確認することができますし、特徴here

+1

答えは 'ProcessBuilder'と' Runtime'の両方を使ってみてうれしいです。ほとんどの答えは 'ProcessBuilder'を使用し、' ProcessBuilder'のコードに答えることを提案しています。それは本当に助けになりました。ありがとう! – SkrewEverything

関連する問題