2016-02-03 17 views
10

Groovyを使用していて、それはjava.lang.Processのサポートです。複数のシェルコマンドを一緒にパイプするにはどうしたらいいですか? groovyを使って、複数のシェルコマンドをパイプするにはどうしたらいいですか?

は、このbashコマンドを考えてみましょう(とユーザー名が fooであると仮定):これは、ユーザ名を出力します

ps aux | grep ' foo' | awk '{print $1}' 

- 1行をユーザーアカウントに関連するいくつかのプロセスのために。しかし、私はこれ以外に何のための任意のテキスト出力を得ることができない

def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print $1}'".execute() 
p.waitFor() 
println p.text 

::Groovyの、ProcessGroovyMethodsドキュメントとコードを使用して

は、私は同じ結果を達成するためにこれを行うことができるはずと言う

def p = "ps aux".execute() 
p.waitFor() 
println p.text 

配管を開始すると、printlnは何も印刷しません。

思考?

答えて

8

これが私の作品:

不明な理由のため
def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute() 
p.waitFor() 
println p.text 

、AWKのパラメータを送信することができません1つの文字列だけ(私はなぜか分からない!おそらくbashは別の言い方で引用しているかもしれない)。あなたのコマンドでエラーストリームをダンプすると、awkスクリプトのコンパイルに関連したエラーが表示されます。

編集は:実際には、Runtime.getRuntime().exec(-string-)

    1. "-string-".execute()デリゲートは、それは「と "または空白を含む引数を処理するために、bashの仕事ですRuntime.execのか、OSが引用符を認識していない
    2. "grep ' foo'".execute()を実行すると、最初のパラメータとして'とgrepコマンドが実行され、2番目のパラメータとしてfoo'が実行されます。無効です。awkと同じです。
  • +0

    @ tim_yatesの答えは、別の方法で私の特定の問題を解決しましたが(私は非常に感謝しています)、この回答はGroovyの 'or'演算子の' 'オブジェクトなので、私はそれを授与するでしょう。ありがとう! –

    8

    あなただけのシェルソート、それを出すために、これを行うことができます。

    // slash string at the end so we don't need to escape ' or $ 
    def p = ['/bin/bash', '-c', /ps aux | grep ' foo' | awk '{print $1}'/].execute() 
    p.waitFor() 
    println p.text 
    
    +0

    ええ、私ができる、それは私が行く必要はなく、で定義された「または」メソッドが動作しない理由を知っている方法かもしれないがお勧め非同期(async)あなたはそれをしたい場合docs? –

    +1

    これはawkと関係があります。確かに何が、この方法で実行されて好きではない –

    +0

    興味深い - スラッシュなアプローチが働いた。二重引用符を使用していませんでした。 Go figure! –

    0

    私は

    proc.consumeProcessOutputStream(new LineOrientedOutputStream() { 
         @Override 
         protected void processLine(String line) throws IOException { 
          println line 
         } 
        } 
        ); 
    
    関連する問題