为什么当我让以下 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
尚未开始,并且仅hello
在sleep 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