【发布时间】:2018-09-29 03:00:42
【问题描述】:
我正在尝试编写一个将执行的 bash 脚本,如果满足某个条件 (grep),则脚本退出,但如果在 X 秒内未找到 grep,那么我希望它回显某些内容,然后退出。最大的问题是其中的命令之一运行时间很长,我必须退出它,否则只会继续运行,直到我关闭终端。
为了提供帮助,我们正在使用 Pusher CLI https://pusher.com/docs/pusher_cli/documentation 在现场 ping IoT 设备。
为了使其正常工作,我首先订阅频道,然后将此过程置于后台,等待 5 秒,然后发送 ping。然后我greping 后台进程的输出并在响应中寻找“pong”,如果找到则退出。这一切都很好,我遇到的问题是找不到“pong”(设备脱机)并且订阅过程只是在后台无限期地运行,我不知道设备处于脱机状态。
所以我想要一些可以触发命令然后在 10 秒后杀死所有东西的东西,但是如果找到“pong”然后用这种方式杀死所有东西。
这是我到目前为止的脚本
ping () {
subscribe_channel $1 &
sleep 5
ping_channel $1
}
ping_channel () {
pusher channels apps trigger --app-id $appid --channel $1 --event $event --message $message
}
subscribe_channel () {
while read -r line; do
echo $line
if [[ $(echo $line | grep "pong") ]]; then
echo "online"
exit
fi
done < <(pusher channels apps subscribe --app-id $appid --channel $1)
}
ping channel
【问题讨论】:
-
顺便说一句,这里有很多引用错误。通过shellcheck.net 运行您的代码并修复它找到的内容。
-
另外,如果您只想测试一行是否包含子字符串,
[[ $line = *pong* ]]实际上比在进程替换中运行调用 grep 的管道快几个数量级。
标签: bash