swatchで指定コマンド実行(exec)時のパラメータ(その2)

昨日のエントリの続きで。

下記みたいな感じで、実行コマンド(hoge.script)にログ内容をパラメータとして渡して実行出来るように
なったと思いきや、新たな問題発覚です。。

watchfor /ERROR/
    exec "hoge.script $_"

合致したログにスペースがあった場合に、パラメータが配列として渡されます。
例えば、こんなログの場合

[2005/12/07 12:10:10] ERROR hogehoge

パラメータとして渡されるのは、スペースで区切られて、下記のような4つになってしまいます。

  • [2005/12/07
  • 12:10:10]
  • ERROR
  • hogehoge

実際swatch(perl)の内部では、下記みたいな感じになっているようで、、

exec("hoge.script $_")

$_が展開されて、実行されるのコマンドイメージは下記のようになります。

hoge.script [2005/12/07 12:10:10] ERROR hogehoge

単純に実行されるコマンド側で、全パラメータを結合したらとかって考えましたが、当然スペースの数とかが判断出来ないので完全なる復元は無理です。
しかもログにパイプ(|)やリダイレクト(>)なんかが入ってたりしたら、コマンド自体実行出来なくなる可能性があるので、どうしたものやらと…

で、よくよく調べたら、アクションでpipeというものがありました。

pipe command[,keep_open]
パイプでコマンドに結果を渡す。keep_openを指定すると異なるパイプが実行されるか、swatchが終了するまでパイプが実行されたままになる 

で、実行されるコマンド側で、パラメータとして受けていたログ内容を、標準出力で受け取るようにして、swatchの設定は下記のように変更したところ、思った通りの動き(ログ内容を1行分受け取れる)ようになりました。

watchfor /ERROR/
    pipe="hoge.script"

最初からpipeでやってれば、、
逆にexecでパラメータ渡して使う場合って無いような気がします。