물고기의 기능을 정의하고 시계와 함께 사용

물고기의 기능을 정의하고 시계와 함께 사용

함수를 정의하고 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

watchFish에서 실행하기 위해 방금 정의한 함수를 어떻게 사용할 수 있나요 ?

답변1

또 다른 방법은저장 기능을 클릭한 다음 watchFish에게 전화하도록 요청합니다.

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고유한 것을 갖고 싶습니다. blotchbash 를 방해하지 않도록 이 이름을 선택했습니다 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

관련 정보