问题是,当执行 watch 时,它会运行sh
,并且出现此错误:
sh: 1: func1: not found
这是代码:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
答案1
默认的 shellwatch
是/bin/sh
. Shell 不会继承其他类型 shell 导出的变量或函数。
如果您的系统没有符号链接/bin/sh
到/bin/bash
(或您当前的 shell),那么您可以使用或watch
来指示执行您的 shell :-x
--exec
watch -x bash -c "my_func"
或者
watch --exec bash -c "my_func"
watch bash -c "test_watch"
这与(不包括)不同,--exec
因为它不用于/bin/sh
生成子进程(在本例中为bash
),一直保持bash
下去。正如其他答案中所警告的那样,如果导出与当前环境高度耦合的函数(即需要其他变量或函数),这可能会变得混乱。
一个例子:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
给出熟悉的
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
答案2
好的,您的方法存在一些问题。
您正在导出一个函数,该函数在 shell 之间不可移植。watch
使用 执行其命令/bin/sh
,而在您的系统上不是bash
。无论它是什么 shell,它都不尊重函数导出,所以你会得到错误。
其次,您可以将命令更改为类似的命令watch bash -c 'func1'
,但这也可能效果不佳。
原因是脚本设置的任何变量都不可用于该函数。您也许能够导出它需要的内容,但这开始变得混乱。
最安全的解决方案是func1
单独放入一个脚本并调用该脚本。
简而言之,尝试:
watch bash -c func1
答案3
watch
为什么要从脚本内部运行?为什么不使用这个 shell 脚本:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
...然后像这样运行它...
$ watch func1 foo