在fish中定义函数,与watch一起使用

在fish中定义函数,与watch一起使用

我想定义一个函数,并每 n 秒调用该函数。举个例子:

function h
    echo hello
end

调用h工程:

david@f5 ~> h
hello

但在使用手表时,却没有...

watch -n 60 "h"

...我得到:

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

sh: 1: h: not found

如何使用watch我刚刚定义的函数在 Fish 中运行?

答案1

另一种方法是保存函数,然后要求watch调用 Fish:

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

funcsave将命名函数定义保存到路径中的文件中~/.config/fish/functions/,因此~/.config/fish/function/h.fish在上述情况下。

答案2

没有简单的方法。默认情况下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

另请注意,fish具有.source因此您可以在另一个文件中定义函数,并能够在其他脚本中重用它,如下所示:

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

. function

h
$ watch ./call.sh

答案3

我做到了!它可以完成工作,但我仍然希望fish有一些本地的东西。我选择这个名称blotch是为了它不会干扰 bash 的watch.

function blotch
    # 2018-10-10
    # 
    # This is like the watch command of bash,
    # but re-implemented in fish.
    # 
    # It takes two arguments:
    #   n: the interval in seconds
    #   fun: a fish function
    # 
    # Therefore, it is always used as:
    # 
    #   blotch n fun
    # 
    # Take note that you should start fish with
    # 
    #   sudo fish
    #   
    # before doing anything with blotch that
    # requires administrator privileges.

    set time (string split " " -- $argv)[1]
    set command (string split " " -- $argv)[2]
    while true
        sleep $time
        eval $command
    end
end

并保存该函数以供以后使用。

funcsave blotch

答案4

另一种非常简单的方法是......

function fonzie
    echo "This is Fonzie!"
end

while true
    fonzie
    sleep 10
end

相关内容