我有一个脚本,我想每隔 x 秒运行一次,直到输出发生变化。通过简单的 while 或 until 循环,我知道如何使用 grep 检查特定字符串的输出,但我想做的是继续迭代循环,直到当前迭代的输出不等于上一次迭代的输出。
如何在 bash 中实现这一点?
我得到的最接近的是下面,该命令在每次迭代中运行两次,但这会产生额外的运行,因为 while 循环无法记住上一次迭代的输出。
while [ "$(command)" = "$(command)" ]; do sleep 10m; done
来自
man 1 watch
:watch
POSIX 不需要,但无论如何它都很常见。在 Debian 或 Ubuntu 中,它与和(以及一些其他工具)procps
一起包含在软件包中。kill
ps
例子:
这应该可以解决问题 - 内联解释:
可能有更简单的方法可以做到这一点,但它有几个有用的功能:
mktemp
用于每个输出。diff
命令会看到两个相同的文件。这样可以避免重复我们正在测试的命令,代价是额外diff
执行一次。显然,
watch
是去这里的方式,如另一个答案中所述。但是,如果您确实想要或需要在 shell 中执行此操作,这里有一种方法:"${prev+set}"
扩展为set
ifprev
在开始时未设置后设置为一个值,因此实际上它强制循环的内容至少运行一次。或者,我们可以初始化prev
为prev=$(some_command)
在循环开始时运行some_command
额外的时间。此外,如注释中所述,命令替换会从命令输出中删除所有尾随换行符,因此如果结果中的唯一更改是这些更改,则无法区分输出。不过,这应该很少有关系。