Como forçar o relógio a executar sob o bash

18

O problema é que, quando o relógio é executado, ele é executado she eu recebo este erro:

sh: 1: func1: not found

aqui está o código:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1
Rachid Oussanaa
fonte
Você pode dar qual comando você realmente executa?
cuonglm
@Gnouc vez de echo $ 1 Eu tenho um script longo pouco para que eu não sei ..
Rachid Oussanaa
Quero dizer, como você executou seu comando ssh?
18714 cuuvlm
@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

Respostas:

10

Ok, existem alguns problemas com sua abordagem.

Você está exportando uma função que não é portátil entre shells. watchexecuta seus comandos com /bin/sh, o que no seu sistema não é bash. E qualquer que seja o shell, ele não respeita as exportações de funções, então você recebe o erro.

Em segundo lugar, você pode alterar seu comando para algo como watch bash -c 'func1', mas isso também pode não funcionar bem.
A razão aqui é que quaisquer variáveis ​​definidas pelo script não estarão disponíveis para a função. Você pode exportar os que precisa, mas isso começa a ficar confuso.

A solução mais segura é inserir func1um script por si só e chamá-lo.
 

Em resumo, tente:

watch bash -c func1
Patrick
fonte
11
É muito CPU intensivo em função caso é definida em.bash_profile
VarunAgw
@ VarunAgw, esse é um bom ponto. No entanto, é um ótimo comando para monitorar coisas em um ambiente em que o .bash_profilearquivo está relativamente vazio. No entanto, eu queria executar um alias que estava no meu .bash_aliasesarquivo ( proveniente do meu.bashrc ), então acabei adicionando o -isinalizador ao bash também. Eu pensei que poderia ajudar alguém:watch bash -ic "func1; alias1; func2; …"
aaiezza
watch -x bash -c my-funcfunciona para mim no Ubuntu Server 16.04 - enquanto outros não.
Nam G VU
14

O shell padrão para watché /bin/sh. Os shells não herdarão variáveis ​​ou funções exportadas de outros tipos de shell.

Se o seu sistema não fizer o link simbólico /bin/shpara /bin/bash(ou seu shell atual), você poderá instruir watcha execução do shell usando -xou --exec:

watch -x bash -c "my_func"

ou

watch --exec bash -c "my_func"

Isso é diferente de watch bash -c "test_watch"(excluindo o --exec), pois não é usado /bin/shpara gerar o processo filho (nesse caso bash), mantendo bashtodo o caminho. Conforme observado em outras respostas, isso pode ficar confuso se exportar funções altamente acopladas ao ambiente atual (ou seja, exigir outras variáveis ​​ou funções).


Um exemplo:

test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"

dá o familiar

Every 2.0s: bash -c test_watch                                   Thu Mar 31 11:15:56 2016

Working!
Andy
fonte
watch -x bash -c my-funcsim, isso funciona para mim no Ubuntu Server 16.04 - enquanto outros não. Muito obrigado!
Nam G VU
4

Por que correr watchde dentro do seu script? Por que não ter este script de shell:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... e depois corra assim ...

$ watch func1 foo
Grilo vermelho
fonte