O problema é que, quando o relógio é executado, ele é executado sh
e 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 sh
e 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. watch
executa 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 func1
um script por si só e chamá-lo.
Em resumo, tente:
watch bash -c func1
.bash_profile
.bash_profile
arquivo está relativamente vazio. No entanto, eu queria executar um alias que estava no meu .bash_aliases
arquivo ( proveniente do meu.bashrc
), então acabei adicionando o -i
sinalizador ao bash também. Eu pensei que poderia ajudar alguém:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
funciona 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/sh
para /bin/bash
(ou seu shell atual), você poderá instruir watch
a execução do shell usando -x
ou --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/sh
para gerar o processo filho (nesse caso bash
), mantendo bash
todo 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-func
sim, isso funciona para mim no Ubuntu Server 16.04 - enquanto outros não. Muito obrigado!
Por que correr watch
de 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