使用带有周期性输出的bash脚本输出有选择地触发另一个脚本

时间:2015-01-25 05:44:34

标签: python linux bash shell

我有一个python脚本,每隔几秒钟探测一个运动传感器并在shell上返回一个值" 传感器关闭"或" 传感器已开启"

接下来,我创建了一个名为sensor.sh

的bash脚本
#!/bin/bash
sudo python /home/pi/ouimeaux/ouimeaux/examples/watch.py "Wemo Motion"  

如果输出流显示" 传感器已开启"

,我尝试执行以下操作来激活trigger.sh
./sensor.sh 2>&1 >/dev/null | grep “on”
if [ $? -eq 1 ]
then
/etc/init.d/trigger.sh start
else
echo "do nothing"
fi

但是,它似乎不起作用 - 我认为stdout重定向可行。

我知道我可以将输出写入日志文件并让另一个脚本读取尾部来执行此操作但是,此脚本在Raspberry Pi上运行,我希望保持较少的磁盘写入。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

2&1将stderr合并到stdout中,但随后你用> /dev/null丢弃stdout,所以grep永远不会看到任何输入。因此,作为您问题的直接解决方案,请取出/ dev / null重定向。

然而,一个更好的解决方案仍然是修改你的python脚本以根据传感器值返回不同的退出状态,然后直接在if语句中使用该状态,这将grep完全从等式中删除

if ./sensor.sh &>/dev/null; then
    /etc/init.d/trigger.sh start
else
    echo "do nothing"
fi

答案 1 :(得分:0)

您测试grep 退出代码。但是 grep在您结束流程之前不会退出

你可以这样做:

stream.py | while read line; do
  if ["$line" = "sensor on"]; then
    echo ON
  fi
done

你可能想做

if echo $line | grep -q on; then

但这会分叉更多的流程。

立即在python中做到这一点要高效得多。