Problem polega na tym, że po uruchomieniu zegarek działa sh
i pojawia się ten błąd:
sh: 1: func1: not found
oto kod:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Problem polega na tym, że po uruchomieniu zegarek działa sh
i pojawia się ten błąd:
sh: 1: func1: not found
oto kod:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
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 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 func1
skryptu i wywołanie tego skryptu.
Krótko mówiąc, spróbuj:
watch bash -c func1
.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
:
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/sh
do odrodzenia procesu potomnego (w tym przypadku bash
), utrzymując bash
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:
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!
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:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... a następnie uruchom to tak ...
$ watch func1 foo