如何强制手表在bash下运行


18

问题是执行watch时它会运行,sh并且出现此错误:

sh: 1: func1: not found

这是代码:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

您能给出实际运行的命令吗?
cuonglm

@Gnouc而不是echo $ 1我的脚本有点长,所以我不知道..
Rachid Oussanaa 2014年

我的意思是您是如何运行ssh命令的?
cuonglm

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa 2014年

Answers:


10

好的,因此您的方法存在一些问题。

您正在导出一个函数,该函数不能在外壳之间移植。watch使用它执行命令/bin/sh,而在您的系统中不是bash。不管它是什么外壳,它都不尊重函数导出,因此会出现错误。

其次,您可以将命令更改为watch bash -c 'func1',但也可能效果不佳。
这是因为脚本设置的任何变量均不适用于该函数。您可能可以导出所需的文件,但是开始变得混乱。

最安全的解决方案是自己放置func1一个脚本并调用该脚本。
 

简而言之,请尝试:

watch bash -c func1

1
如果函数定义于.bash_profile
VarunAgw '16

@VarunAgw,这是一个好点。但是,这是用于在.bash_profile文件相对为空的环境中监视事物的好命令。但是,我确实想运行文件中的别名.bash_aliases通过my获取.bashrc),因此最终也将-i标志添加到bash中。我认为这可能会对某人有所帮助:watch bash -ic "func1; alias1; func2; …"
aaiezza

watch -x bash -c my-func在Ubuntu Server 16.04上对我有用,而其他人则不行。
Nam G VU

14

对于默认的shell watch/bin/sh。Shell不会从其他类型的Shell继承导出的变量或函数。

如果您的系统未符号链接/bin/sh/bin/bash(或当前的shell),则可以watch使用-x或指示执行shell --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!

只有watch -x bash -c my-func是的,这对我在Ubuntu Server 16.04上有效,而其他人则不行。万分感谢!
Nam G VU

4

为什么watch要从脚本内部运行?为什么没有这个shell脚本:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

...然后像这样运行它...

$ watch func1 foo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.