Defina a função no peixe, use-a com o relógio

0

Eu quero definir uma função e chamar essa função a cada n segundos. Como exemplo:

function h
    echo hello
end

Chamando h funciona:

david@f5 ~> h
hello

Mas ao usar o relógio, não ...

watch -n 60 "h"

... e eu recebo:

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

sh: 1: h: not found

Como posso executar watch em fish, com a função que acabei de definir?

    
por user258532 10.10.2018 / 21:06

3 respostas

3

Outra forma seria salvar a função e, em seguida, solicitar que watch invocasse peixe:

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

funcsave salva a definição da função nomeada em um arquivo no caminho ~/.config/fish/functions/ , portanto ~/.config/fish/function/h.fish no caso acima.

    
por 10.10.2018 / 21:47
3

Não há um caminho fácil. Por padrão, watch usa /bin/sh para executar comandos, mas recebe -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.

No entanto, nada não funcionará com fish porque h function não é exportado para o ambiente:

$ 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
^

Em bash você pode exportar uma função para o ambiente com export -f e use-o dentro de watch assim:

$ 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

Se você usar fish , poderá criar um script de wrapper e chamá-lo com watch :

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

function h
    date
end

h

$ watch -n5 ./stuff.sh

Observe também que fish tem . e source para que você possa definir a função em outro arquivo e ser capaz de reutilizá-lo em outros scripts como esse:

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

. function

h
$ watch ./call.sh
    
por 10.10.2018 / 21:37
0

Sim, eu fiz isso! Ele faz o trabalho, mas eu ainda desejo que fish tenha algo nativo. Eu escolho o nome blotch para que ele não interfira no watch do bash.

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

E salve a função para uso posterior.

funcsave blotch
    
por 10.10.2018 / 22:46