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
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
Odpowiedzi:
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
.bash_profile
.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; …"
watch -x bash -c my-funcdla mnie na Ubuntu Server 16.04 - podczas gdy inni nie.
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!
watch -x bash -c my-functak, to działa dla mnie na Ubuntu Server 16.04 - podczas gdy inni nie. Wielkie dzięki!
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