Jak zmusić zegarek do działania pod uderzeniem

18

Problem polega na tym, że po uruchomieniu zegarek działa shi pojawia się ten błąd:

sh: 1: func1: not found

oto kod:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1
Rachid Oussanaa
źródło
Czy możesz podać polecenie, które faktycznie wykonujesz?
cuonglm
@Gnouc zamiast echa 1 $ mam trochę długi skrypt, więc nie wiem ..
Rachid Oussanaa,
Mam na myśli, jak uruchomiłeś polecenie ssh?
cuonglm
@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

Odpowiedzi:

10

Ok, więc jest kilka problemów z twoim podejściem.

Eksportujesz funkcję, która nie jest przenośna między powłokami. watchwykonuje polecenia za pomocą /bin/sh, których w twoim systemie nie ma bash. I cokolwiek to jest powłoka, nie uwzględnia eksportu funkcji, więc pojawia się błąd.

Po drugie, możesz zmienić swoje polecenie na coś podobnego watch bash -c 'func1', ale to również może nie działać dobrze.
Powodem jest to, że zmienne ustawione przez skrypt nie będą dostępne dla funkcji. Możesz być w stanie wyeksportować te, których potrzebuje, ale zaczyna to robić bałagan.

Najbezpieczniejszym rozwiązaniem jest samodzielne wprowadzenie func1skryptu i wywołanie tego skryptu.
 

Krótko mówiąc, spróbuj:

watch bash -c func1
Patrick
źródło
1
Jest bardzo obciążający procesor w przypadku, gdy funkcja jest zdefiniowana w.bash_profile
VarunAgw
@VarunAgw, to dobra uwaga. Jest to jednak świetne polecenie do monitorowania rzeczy w środowisku, w którym .bash_profileplik jest względnie pusty. Jednak chciałem uruchomić alias, który był w moim .bash_aliasespliku ( pochodzący z mojego.bashrc ), więc ostatecznie dodałem -iflagę do bash. Pomyślałem, że to może komuś pomóc:watch bash -ic "func1; alias1; func2; …"
aaiezza
Działa tylko watch -x bash -c my-funcdla mnie na Ubuntu Server 16.04 - podczas gdy inni nie.
Nam G VU
14

Domyślna powłoka watchto /bin/sh. Powłoki nie dziedziczą eksportowanych zmiennych lub funkcji z innych rodzajów powłok.

Jeśli twój system nie łączy dowiązania symbolicznego /bin/shz /bin/bash(lub twoją bieżącą powłoką), możesz poinstruować, watchaby wykonać powłokę za pomocą -xlub --exec:

watch -x bash -c "my_func"

lub

watch --exec bash -c "my_func"

Różni się to od watch bash -c "test_watch"(z wyjątkiem --exec), ponieważ nie używa /bin/shdo odrodzenia procesu potomnego (w tym przypadku bash), utrzymując bashdo końca. Jak opisano w innych odpowiedziach, może to być nieuporządkowane, jeśli funkcje eksportu są ściśle powiązane z bieżącym środowiskiem (tj. Wymagają innych zmiennych lub funkcji).


Przykład:

test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"

daje znajome

Every 2.0s: bash -c test_watch                                   Thu Mar 31 11:15:56 2016

Working!
Andy
źródło
Tylko watch -x bash -c my-functak, to działa dla mnie na Ubuntu Server 16.04 - podczas gdy inni nie. Wielkie dzięki!
Nam G VU
4

Po co biegać watchze skryptu? Dlaczego nie mieć tego skryptu powłoki:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... a następnie uruchom to tak ...

$ watch func1 foo
Red Cricket
źródło