如何在“watch”命令中运行bash函数?

如何在“watch”命令中运行bash函数?

假设我在 bashrc 中定义了一个函数 f

function f() {
  date
}

我想运行以下命令来监视输出 watch f。该命令失败并显示“sh:f: 未找到命令“。 watch bash -c f给出了相同的结果。

如何让这个 watch 命令按预期工作?

答案1

watch是一个外部程序,每个时间间隔都会启动一个新程序。

在您的情况下,启动的默认 shellsh和显式启动的 shell都不bash知道您的函数f- 它不会被传递给它们。

您可以在运行的内容中包含函数定义。例如,你可以写

#!/bin/bash
function f() {
  date
}
f

写入文本文件“myscript.sh”,使其可执行并使用watch ./myscript.sh.

或者,您也可以

function f () {
}
typeset -fx f
#   ^---------- modify the type of a name
#        ^----- work only on functions
#         ^---- export to environment
watch -x bash -c "f"
#     ^-------- use `exec` rather than `system` to start bash;
#               makes no sense to start a shell from a shell you
#               only start to start a shell (but omitting -x has
#               no downside other than launching an unnecessary
#               middle layer of `sh`)

将函数声明导出到环境变量,从而使 bash 知道从 启动watch,因为子进程继承环境变量。

我建议您使用脚本选项 - 减少混乱,并且不会扰乱环境,这可能会产生令人惊讶的副作用。它没有性能优势:在这两种情况下,shell 都会在新的子 shell 中解析函数声明的源代码。

最后,你可以不用watch

while true ; do
  tput clear # to clear the screen
  f
  sleep 1
done

tput clear将清除滚动缓冲区;如果您以前有过任何相关内容,您可能想先保存它。

相关内容