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

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

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!

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.