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.
É 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
Só 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).
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:
fonte
.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á instruirwatch
a execução do shell usando-x
ou--exec
:ou
Isso é diferente de
watch bash -c "test_watch"
(excluindo o--exec
), pois não é usado/bin/sh
para gerar o processo filho (nesse casobash
), mantendobash
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:
dá o familiar
fonte
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:... e depois corra assim ...
fonte