我正在尝试实现一个bash脚本,该脚本应该在Python脚本终端输出中搜索一个单词。
Python脚本不会停止,因此命令末尾需要“&”,但是“ if [$?== 0];那么”条件不起作用。
如何解决?
谢谢,加尔。
#!/bin/bash
#Check if Pixhawk is connected
PORT=/dev/ttyPixhawk
end=$((SECONDS+3))
not_exists=f
/usr/local/bin/mavproxy.py --daemon --non-interactive --master=$PORT | grep 'Failed' &> /dev/null &
while [ $SECONDS -lt $end ] ; do
if [ $? == 0 ] ; then
not_exists=t
fi
sleep 1
done
if [ $not_exists=t ] ; then
echo "Not Exists"
else
echo "Exists"
fi
kill $(pgrep -f '/usr/local/bin/mavproxy.py')
答案 0 :(得分:1)
Bash对后台命令的输出一无所知。用[ 5444 -lt 3 ] & echo $?
检查自己。
您的if
语句在任何情况下都不起作用,因为$?
会检查最近的前一条命令的返回值,在这种情况下,这是您的while
循环。
您有几种选择。如果您在等待某些输出,并且知道输出在到达您要查找的目标之前存在多长时间,则可以让python将文件写入文件,并通过超时检查文件大小以确保失败
您还可以继续使用简单的定时方法,因为您只需在几秒钟后检查输出,然后根据该结果确定成功或失败。
您可以使python脚本实际结束,或提供更多错误消息,或仅将相关部分写入文件。
此外,您确实应该通过shellcheck.net运行脚本,以发现更多问题。
您需要更清晰地定义目标和用例,以获得真正的帮助;我们真正能说的是“您的方法行不通,但是肯定有一些方法行得通”
答案 1 :(得分:0)
您正在使用babel command not recognized as an external or internal command
在while循环中检查grep
命令输出的状态。如果$?
是grep之后要触发的下一个命令,并且grep不是back-group进程,则可以执行此操作。但是在您的脚本中,$?
将返回$?
的状态。您可以尝试将输出重定向到临时文件并检查其状态
while [$SECONDS -lt $end ]