tailf出力をスクリプト引数として使用する

tailf出力をスクリプト引数として使用する

次の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 TestSlackチャンネルに「test」という言葉が投稿されています。

答え1

問題は、message.shコマンドが起動しないことです。シェルは$(...)結果を引数として渡すために最初にコマンドを評価する必要がありますが、使用中の操作はtailf無限です。これを以下と比較してみてください。

ls $(echo hello;sleep 10) & sleep 1; ps

まだ起動していないpsことを示し、完了して部分的に完了した場合にのみ引数を取得します。lshellosleep 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

関連情報