Скрипт 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 делает все, что работает, за исключением незначительной проблемы, которую он записывает в терминал.

вопросы

  1. что случилось с моей командой?
  2. как именно терминальные эмуляторы реагируют на ctrl + C?
  3. почему удаление 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