我想定义一个函数,并每 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