如何强制watch在bash下运行

如何强制watch在bash下运行

问题是,当执行 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

相关内容