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.
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).
Odpowiedzi:
Ok, więc jest kilka problemów z twoim podejściem.
Eksportujesz funkcję, która nie jest przenośna między powłokami.
watch
wykonuje polecenia za pomocą/bin/sh
, których w twoim systemie nie mabash
. 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
func1
skryptu i wywołanie tego skryptu.Krótko mówiąc, spróbuj:
źródło
.bash_profile
.bash_profile
plik jest względnie pusty. Jednak chciałem uruchomić alias, który był w moim.bash_aliases
pliku ( pochodzący z mojego.bashrc
), więc ostatecznie dodałem-i
flagę do bash. Pomyślałem, że to może komuś pomóc:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
dla mnie na Ubuntu Server 16.04 - podczas gdy inni nie.Domyślna powłoka
watch
to/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/sh
z/bin/bash
(lub twoją bieżącą powłoką), możesz poinstruować,watch
aby wykonać powłokę za pomocą-x
lub--exec
:lub
Różni się to od
watch bash -c "test_watch"
(z wyjątkiem--exec
), ponieważ nie używa/bin/sh
do odrodzenia procesu potomnego (w tym przypadkubash
), utrzymującbash
do 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:
daje znajome
źródło
watch -x bash -c my-func
tak, to działa dla mnie na Ubuntu Server 16.04 - podczas gdy inni nie. Wielkie dzięki!Po co biegać
watch
ze skryptu? Dlaczego nie mieć tego skryptu powłoki:... a następnie uruchom to tak ...
źródło