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
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
Respostas:
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
.bash_profile
.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; …"
watch -x bash -c my-funcfunciona para mim no Ubuntu Server 16.04 - enquanto outros não.
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!
watch -x bash -c my-funcsim, isso funciona para mim no Ubuntu Server 16.04 - enquanto outros não. Muito obrigado!
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