Скрипт 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