Como forçar o relógio a ser executado sob o bash

12

O problema é que, quando o relógio é executado, ele executa 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
    
por Rachid Oussanaa 13.07.2014 / 20:29

3 respostas

8

Ok, existem alguns problemas com a sua abordagem.

Você está exportando uma função, que não é portátil entre os shells. watch executa seus comandos com /bin/sh , que no seu sistema não é bash . E qualquer que seja o shell, ele não respeita as exportações de funções, portanto, 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 é colocar func1 em um script por si só e chamar esse script.

Em resumo, tente:

watch bash -c func1
    
por 13.07.2014 / 21:22
10

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

Se o seu sistema não ligar simbolicamente /bin/sh a /bin/bash (ou seu shell atual), então você pode instruir watch para executar seu 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 --exec ), pois não usa /bin/sh para gerar o processo filho (nesse caso, bash ), mantendo bash até o fim. Conforme oculto 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!
    
por 31.03.2016 / 12:29
3

Por que executar watch dentro do seu script? Por que não ter este script de shell:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... e depois executá-lo assim ...

$ watch func1 foo
    
por 13.07.2014 / 21:23