Function

在fish中定義函式,與watch一起使用

  • December 20, 2019

我想定義一個函式,並每隔 n 秒呼叫一次該函式。舉個例子:

function h
   echo hello
end

呼叫h工作:

david@f5 ~> h
hello

但是在使用watch時,它不會…

watch -n 60 "h"

…我得到:

Every 60.0s: h                                      f5: Wed Oct 10 21:04:15 2018

sh: 1: h: not found

如何watch使用我剛剛定義的功能在魚中執行?

另一種方法是保存函式,然後要求watch呼叫fish:

bash$ fish
fish$ function h
   echo hello
end
fish$ funcsave h
fish-or-bash$ watch -n 60 "fish -c h"

funcsave將命名函式定義保存到 path 中的文件中~/.config/fish/functions/,因此~/.config/fish/function/h.fish在上述情況下。

沒有簡單的方法。預設情況下watch用於/bin/sh執行命令,但需要-x

  -x, --exec
         Pass  command  to  exec(2)  instead  of  sh -c which reduces           
         the need to use extra quoting to get the desired effect.

但是,沒有什麼不能使用,fish因為h函式沒有導出到環境:

$ watch -n 5 --exec  fish -c h
Every 5.0s: fish -c h                                                                                                                                                                 comp: Wed Oct 10 21:30:14 2018

fish: Unknown command 'h'
fish:
h
^

bash您可以將函式導出到環境export -f 並在內部使用它,watch如下所示:

$ h1 () {
> echo hi
> }
$ type h1
h1 is a function
h1 ()
{
   echo hi
}
$ export -f h1
$ watch -n 60 bash -c h1
Every 60.0s: bash -c h1                                                                                                                                                               comp: Wed Oct 10 21:29:22 2018

hi

如果您使用fish,您可以創建一個包裝腳本並使用以下命令呼叫它watch

$ cat stuff.sh
#!/usr/bin/env fish

function h
   date
end

h

$ watch -n5 ./stuff.sh

還要注意fishhas .source因此您可以在另一個文件中定義函式並能夠在其他腳本中重新使用它,例如:

$ cat function
function h
   echo hi
end
$ cat call.sh
#!/usr/bin/env fish

. function

h
$ watch ./call.sh

引用自:https://unix.stackexchange.com/questions/474628