このシェルを Java で実行しようとしましたが、うまくいきません。
Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");
cmd を " ls
" や " "などに変更するopen foo.java
と、コードが機能します。
理由はありますか?
問題は、ファイルのワイルドカード パターンがglobによって展開されないことです。したがって、パターンは文字どおりに処理され、ファイルは見つかりません。bash
これを解釈するには、次のようなシェルが必要です。
Process p = Runtime.getRuntime().exec(new String[] {
"bash", "-c",
"cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });
getErrorStreamの内容を確認してください。
余談: varargs 配列を使用して command を構築する、より便利な ProcessBuilderString
の使用を検討してください。
ここにはいくつかの問題があります。
*.java
部分は、通常シェルによって展開されるグロブです基本的に、このタイプのパイプラインを実行するにはシェルを呼び出す必要があります。このexec
メソッドは、引数を指定して特定のプログラムを実行します。シェルを直接呼び出してコマンドラインを引数として渡すことでこれを機能させることができるかもしれませんが、それが機能するかどうかは疑問です。
cat *.java
ディレクトリの内容を列挙し、各ファイルを個別に読み取ることによって、パーツを実装する必要がある場合があります。Process
コマンドごとに個別のインスタンスを開きsed
、インスタンスの入力ストリームと出力ストリームを使用してそれらの間のパイプラインを実装しProcess
ます。