假设我在 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
将清除滚动缓冲区;如果您以前有过任何相关内容,您可能想先保存它。