有选择地将 bash 脚本输出与定期输出一起使用以触发另一个脚本



我有一个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&1

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

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

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

你测试 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中执行此操作要高效得多。

最新更新