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 Test会将“测试”一词发布到 Slack 频道。

答案1

问题是您的message.sh命令从未启动。 shell 首先需要评估$(...)命令,以便将结果作为参数传递,但您使用的是tailf永无止境的。与此比较:

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

ps显示ls尚未开始,并且仅hellosleep 10完成且$()部分完成时才会获取 arg。

答案2

尝试用双引号传递。如果您的操作系统支持超时命令,请尝试使用超时(请参阅下面的帖子)

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

相关内容