Intereting Posts
Не удается достоверно создать каталог при запуске после того, как экземпляр ec2 монтирует свои эфемерные диски Почему мой файл x11vnc.desktop не разрешает подсеть? Как искать и заменять строку символами новой строки в командной строке в файле Получение неправильного ответа с даты через awk Можно ли получить доступ к дискам независимо в томе RAID-1? Почему systemctl изолирует multi-user.target только один раз? Как настроить удаленные графические сеансы для CentOs? Как загрузить изображение бродяг? SSH и SCP-конвейерная машина ubuntu для нового пользователя Как решить странную ошибку при запуске Google Chrome? Как сделать скрипт bash спросить вас, хотите ли вы выполнить следующий сегмент (часть)? Может ли sed сохранить свой вывод в файл? Как переопределить исходный код в сценарии оболочки Linux? Перенаправление Bash не работает для команды SQLite Из какого дополнения Apache2 эти журналы?

Почему это «while kill -0 $ PID», а не «до kill -0 $ PID»?

Я могу быть здесь глупым, но если я хочу что-то сделать, пока процесс запущен, зачем мне это делать:

while kill -0 $PID do #... done 

вместо

 until kill -0 $PID do #... done 

?

kill -0 выходит с кодом 1 если процесс не найден, и 0 если процесс найден:

 $ kill -0 123444 -bash: kill: (123444) - No such process $ echo $? 1 $ screen -ls | grep rofl 28043.rofl (02/19/2015 02:27:56 PM) (Detached) $ kill -0 28043 $ echo $? 0 

Итак, если процесс запущен, не будет ли цикл while работать до:

 while 0 do #... done 

который никогда не будет выполняться?

При обращении с кодами возврата «0» – это успех, а ненулевой – отказ. Синтаксис цикла while:

 while COMMANDS; do ...; done 

Оператор while проверяет код возврата последней команды в предоставленном списке команд. В последнем примере while 0 это попытается выполнить команду с именем «0» и проверить код возврата.

Литерал 0 не является особенным для bash вне арифметического контекста. Внутри этого контекста 0 считается ложным. Например

 while (( 0 )); do ... # never executes end 

Этот случай является особым как ключевое слово (( рассматривается как команда, которая возвращает ненулевое значение, потому что результат равен 0.

Оболочка не расширяет условия, как вы думаете.

В оболочке код ошибки 0 указал, что команда успешно завершена. Любой ненулевой код ошибки указывает на наличие ошибки.

Более кратко, POSIX определяет цикл while как:

Цикл while должен непрерывно выполнять один составной список, если другой составной список имеет нулевой статус выхода.

Формат цикла while следующий:

 while compound-list-1 do compound-list-2 done 

Составной список-1 должен быть выполнен, и если он имеет ненулевой статус выхода, команда while должна завершиться. В противном случае составной список-2 должен быть выполнен, и процесс должен повторяться.

Команда «while» не ищет логическое значение, она ищет код возврата «0», что указывает на успешное выполнение команды. Поэтому в случае команды while команда, которая возвращает 0, является «истиной», а все остальное «ложью».

Даже когда вы делаете сравнение, Bash рассматривает это как команду, возвращающую успешный код ошибки (0), когда сравнение истинно.

Код выхода не является логическим значением, является целым числом, по соглашению нулевое значение является успешным, поэтому вы думаете об отрицательной логике с точки зрения Баша