Хорошо, думаю, я понял, что здесь происходит. В команде
while ! ping -c1 -w1 -n 8.8.8.8 > /dev/null 2&>1
&
и >
расположены в неправильном порядке. Это вызывает цепную реакцию путаницы и неожиданных интерпретаций.
В частности, bash анализирует 2&>1
в качестве аргумента "2
", за которым следует перенаправление &>1
, которое отправляет как stdout, так и stderr в файл названный "1". Таким образом, он запускает эту команду со всеми выходными данными, равными «1»:
ping -c1 -w1 -n 8.8.8.8 2
Некоторые версии ping
будут выдавать здесь сообщение об ошибке / использовании, поскольку они принимают только один целевой IP-адрес (а затем выйдите с состоянием ошибки, заставив l oop работать вечно).
Другие версии будут интерпретировать 8.8.8.8
как переход на конечный пункт назначения 2
, который является старым сокращением для IP-адреса 0.0.0.2
. Который на самом деле не существует на Inte rnet. Это означает, что ping
завершится с ошибкой и завершится с ошибкой, в результате чего l oop будет работать вечно.
Я подозреваю, что если вы посмотрите в файл "1", вы сможете сказать, какие из них (или, возможно, что-то еще) происходит.
Здесь можно выучить несколько уроков написания сценариев:
- Все эти крипты c груды символов материи , и если вы немного ошиблись, вы можете сделать что-то очень отличное от того, что планировали.
- Отбрасывание вывода (особенно вывод ошибок) - это хороший способ скрыть, что идет не так. Если у скрипта возникли проблемы, запишите и изучите все ошибки, которые его компоненты вызывают.
set -x
велит оболочке печатать то, что, по ее мнению, он выполняет при выполнении команд, и помещать это перед разделами проблемы в скриптах (и set +x
потом выключить) это хорошее слово, чтобы узнать, что происходит. Вот как я понял, что bash рассматривал «2
» как аргумент, а не как часть перенаправления. - shellcheck. net удобно!