Скрипт Bash для уведомления при доступе в интернет
я написал этот сценарий bash, чтобы иметь уведомление, когда интернет становится доступным, но я не понимаю многих вещей, которые происходят. Вот сценарий:
while ! ping 8.8.8.8 -c 1 2&> /dev/null ; do true; done;
- на говорит
ping
что я хочу отправить только один пакет. - на
2&> /dev/null
есть, потому что я не хочу видеть на выходе. -
true
потому чтоbash
не принялиdo;
синтаксис. - условие прекращения
! ping ...
, потому чтоping
возвращает ненулевой код состояния, когда пакет не получен до некоторогоtimeout
.
предполагаемое поведение было для этого цикла, чтобы закончить, когда ping
успешно и эмулятор терминала автоматически отправить мне уведомление.
проблемы
- эта команда не заканчивается даже тогда, когда интернет становится доступным.
- попытка убить команду с
ctrl + C
не работает. Я думаю, это убивает. суб-командыping
вместо всей команды. - только удалением
2&> /dev/null
делает все, что работает, за исключением незначительной проблемы, которую он записывает в терминал.
вопросы
- что случилось с моей командой?
- как именно терминальные эмуляторы реагируют на
ctrl + C
? - почему удаление
2&> /dev/null
заставить его работать?
обратите внимание, что у меня уже есть переворот. Тем не менее я хочу понять!--6--> немного больше.
f() { while ! ping 8.8.8.8 -c 1 ; do true; done; }; f 2&> /dev/null
3 ответов
правильный оператор перенаправления &>
, а не 2&>
. В 2 анализируется как отдельный аргумент ping
, а так пинг 2
никогда не удается, цикл никогда не существует.
что-то, что я обычно делаю в таких циклах, добавляет вместо true
:
while ! ping 8.8.8.8 -c 1 &> /dev/null ; do sleep 1; done;
таким образом, вы можете использовать Ctrl+C
во время сна и отменить весь цикл.
Я думаю, что лучший способ-установить тайм-аут в ping.
while ! ping -c 1 -W 2 8.8.8.8 >/dev/null 2>&1 ; do sleep 1 ; done