2016-06-12 5 views
0

にリダイレクトを使用しているとき、私はProcessBuilderを使用してこのコマンドを実行したいProcessBuilderをを使用する方法:以下の私が試してみましたLinuxの

sort -m -u -T /dir -o output <(zcat big-zipped-file1.gz | sort -u) <(zcat big-zipped-file2.gz | sort -u) <(zcat big-zipped-file3.gz | sort -u) 

を:私はこのようなargsを使用しています

// This doesn't recognise the redirection. 
String[] args = new String[] {"sort", "-m", "-u", "-T", "/dir", "-o", "output", "<(zcat big-zipped-file1.gz | sort -u)", "<(zcat big-zipped-file2.gz | sort -u)", "<(zcat big-zipped-file3.gz | sort -u)"}; 

// This gives: 
// /bin/sh: -c: line 0: syntax error near unexpected token `(' 
String[] args = new String[] {"/bin/sh", "-c", "\"sort -m -u -T /dir -o output <(zcat big-zipped-file1.gz | sort -u) <(zcat big-zipped-file2.gz | sort -u) <(zcat big-zipped-file3.gz | sort -u)\""}; 

processBuilder.command(args);

+0

私の質問が更新されました。いくつかのzcatコマンドの出力をソートにリダイレクトしたい。 –

+0

ProcessBuilderはシェルではありません。シェルを明示的に呼び出すか、リダイレクトを自分で実行します。 – jtahlborn

+0

これは重複していません。ここの問題は違う。私は2回目の試みで明示的にシェルを呼び出しました。 –

答えて

0

私はついにそれを理解しました。ローマが彼のコメントで述べたように、shはリダイレクトを理解していないので、bashを使用しなければなりませんでした。私はまた、入力ストリームとエラーストリームの両方を消費しなければなりませんでした。

String[] args = new String[] {"/bin/bash", "-c", "sort -m -u -T /dir -o output <(zcat big-zipped-file1.gz | sort -u) <(zcat big-zipped-file2.gz | sort -u) <(zcat big-zipped-file3.gz | sort -u)"}; 

ProcessBuilder builder = new ProcessBuilder(); 
builder.command(args); 
Process process = builder.start(); 
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 
BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
while((line = input.readLine()) != null); 
while((line = error.readLine()) != null); 

process.waitFor(); 
+0

'process.getInputStream()'を2回使用しました。 2番目はエラーストリームでなければなりません。 – Roman

+0

ありがとうございます。それを修正! –