是否有可能观察命令直到输出保持不变?
使用watch -g
,可以检查命令结果是否发生更改,并将其用作触发器以转到脚本中的下一步。但是,如果我想检查命令在两次连续(或定义的连续次数)运行中返回相同的输出,该怎么办?
就像是
watch --exit-on-constant-output --number-of-minimum-identical-runs=10 <command>
目前我想到的唯一方法是一个脚本,该脚本在第一次运行时保存输出,然后进行比较,如下所示:
#!/bin/bash
breaklimit=4
n=0
old=$(command)
while ((1)) ; do
current=$(command)
if [[ "$old" == "$current" ]] ; then
echo "command gave same output"
n=$((n+1))
echo "number of identical, consecutive runs: $n"
if [[ $n -eq $breaklimit ]] ; then
break
fi
else
echo "command gave different output"
old="$current"
n=0
sleep 2
fi
done
echo "run next command"
例如使用$(($RANDOM/10000))
as 命令效果很好。但也许有更优雅的方式?
PS:也许一些虚构的用例会有所帮助。假设我将温度计连接到加工机器,并希望在温度稳定后开始生产。所以我会每 60 秒查询一次温度计的当前温度。
答案1
这似乎有效(在 Linux 上):
while :
do
timeout 8 watch -g my-command my-args || break
done
笔记:
而不是您所说的“运行次数”,这仅指定输出必须相同的秒数
如果
my-command
它不喜欢在运行时被杀死,这可能不合适,或者至少-n
需要调整超时值和手表的选项以减少发生这种情况的机会。
解释:
基本思想是,如果超时结束时命令仍在运行,则超时命令将退出并出现错误(退出代码 124)。 (你可以运行
timeout 2 date; echo $?
timeout 2 sleep 3; echo $?
看看它的实际效果。
我们将其与watch -g
.如果 watch 在超时之前退出(即输出发生变化),则超时返回,退出代码为 0,并且循环继续。
如果输出在(在我的示例中)8秒内没有改变,watch将被超时终止,并且超时将退出并出现错误,并中断循环。