次のtailfを実行すると、なぜこれが起こりますか?
tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}'
希望の出力を取得します。
Den Window Sensor is off
ただし、スクリプトにパラメータとして渡す場合(スクリプトで$ 1を使用):
./message.sh $(tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}')
期待どおりにメッセージを転送しませんか?明確な説明のために、message.sh Test
Slackチャンネルに「test」という言葉が投稿されています。
答え1
問題は、message.sh
コマンドが起動しないことです。シェルは$(...)
結果を引数として渡すために最初にコマンドを評価する必要がありますが、使用中の操作はtailf
無限です。これを以下と比較してみてください。
ls $(echo hello;sleep 10) & sleep 1; ps
まだ起動していないps
ことを示し、完了して部分的に完了した場合にのみ引数を取得します。ls
hello
sleep 10
$()
答え2
二重引用符で渡してください。オペレーティングシステムがtimeoutコマンドをサポートしている場合は、timeoutを使用してみてください(下記の記事を参照)。
https://stackoverflow.com/questions/10430126/how-to-stop-tail-f-command-executed-in-sub-shell
タイムアウトしたくない場合はこれを試してください
#!/bin/bash
tailf /var/log/z-way-server.log | grep --line-buffered device-info | gawk 'BEGIN { FS = "\"" } ; {print $4,"is",$8}' | while read line
do
/absolute/path/of/message.sh "${line}"
done