Bash シェル スクリプトを Groovy に移植しています。ほとんどのコンストラクトは簡単に変換できます(たとえばmkdir "$foo"
、にfoo.mkdir()
。しかし、私はこれに困惑しています:
#!/bin/bash
sleep 60 > /tmp/output.log 2>&1 < /dev/null
実行するときは、次のファイル記述子を調べてみましょうsleep
。
$ ls -l /proc/$(pgrep sleep)/fd
total 0
lr-x------ 1 user user 64 Feb 25 13:40 0 -> /dev/null
l-wx------ 1 user user 64 Feb 25 13:40 1 -> /tmp/output.log
l-wx------ 1 user user 64 Feb 25 13:40 2 -> /tmp/output.log
Groovy でプロセスを実行するには、次のようにします (このページによると)。
#!/usr/bin/groovy
def log = new FileOutputStream("/tmp/output.log")
def sleep = "sleep 60".execute()
sleep.waitForProcessOutput(log, log)
そしてのファイル記述子sleep
:
$ ls -l /proc/$(pgrep sleep)/fd
total 0
lr-x------ 1 user user 64 Feb 25 13:41 0 -> pipe:[522455]
l-wx------ 1 user user 64 Feb 25 13:41 1 -> pipe:[522456]
l-wx------ 1 user user 64 Feb 25 13:41 2 -> pipe:[522457]
ご覧のとおり、ファイル記述子は別のもの (おそらく Groovy プロセス) に関連付けられています。これは長時間実行されるプロセスに使用されるため、仲介者として Groovy を切り取りたいと考えています。
それで、私の質問:外部プロセスを切り離すことができ、Groovy を実行する必要がないように、ファイルをファイルにリダイレクトするにはどうすればよいですか?stdin
stdout
stderr
編集:この質問はGroovy のキャプチャ プロセス出力の複製ではありません。その質問は、Groovy プロセス自体のリダイレクトとおよびへのリダイレクトに関するものだからです。@tim_yates`の回答からわかるように、これはまったく別のものです。stdout
stderr
stdout
stderr