Napisałem ten skrypt bash, aby otrzymać powiadomienie, gdy Internet stanie się dostępny, ale nie rozumiem wielu rzeczy, które się dzieją. Oto scenariusz:Skrypt Bash do powiadamiania, gdy dostęp do Internetu jest
while ! ping 8.8.8.8 -c 1 2&> /dev/null ; do true; done;
- Opcja
-c 1
mówiping
że chcę wysłać tylko jeden pakiet. - Jest tam
2&> /dev/null
, ponieważ nie chcę widzieć danych wyjściowych. true
jest tam, ponieważbash
nie zaakceptował składnido;
.- warunkiem zakończenia jest
! ping ...
, ponieważping
zwraca kod statusu niezerowy, gdy nie jest odbierany żaden pakiet przed niektórymitimeout
.
Zamierzeniem było zakończenie tej pętli po pomyślnym zakończeniu ping
, a emulator terminala automatycznie wyśle do mnie powiadomienie.
Problemy
- Komenda ta nie kończy się nawet wtedy, gdy Internet staje się dostępny.
- Próba zabicia polecenia przy użyciu
ctrl + C
nie działa. Myślę, że to zabicie podkomunikatuping
zamiast całego polecenia. - Usunięcie tylko
2&> /dev/null
powoduje, że wszystko działa, z wyjątkiem drobnego problemu, który wypisuje wyjście do terminala.
Pytania
- Co jest nie tak z moją komendą?
- Jak dokładnie emulatory terminala reagują na
ctrl + C
? - Dlaczego usunięcie
2&> /dev/null
powoduje, że działa?
Pamiętaj, że już dokonałem zwrotu. Niemniej jednak chcę zrozumieć nieco więcej.
f() { while ! ping 8.8.8.8 -c 1 ; do true; done; }; f 2&> /dev/null
Moja wersja 'ping' oczekuje' ping -c 1 8.8.8.8'. Pluse-uno do zbadania twojego problemu! Powodzenia. – shellter