Почему это «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 

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

4 Solutions collect form web for “Почему это «while kill -0 $ PID», а не «до kill -0 $ PID»?”

При обращении с кодами возврата «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), когда сравнение истинно.

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

  • Запустите команду в sudo через SSH
  • Почему «sudo su» в сценарии оболочки не запускает остальную часть скрипта как root?
  • Как получить последнюю часть http-ссылки в Bash?
  • Печать строк между двумя шаблонами с SED
  • Запуск скрипта cron с lynx не работает
  • Скрипт для запуска приложения с выделенной графической картой (Fedora 25)
  • Я случайно скопировал часть каталога / * to / some /, как мне исправить мою ошибку?
  • Присвоение вывода ls переменной приводит к неожиданному поведению
  • Когда параллельный выход GNU, моя программа также терпит неудачу
  • Как сделать скрипт sudo без пароля для любого пользователя в bash
  • Как удалить все файлы в каталоге, кроме одного файла в Solaris
  • Interesting Posts

    Как я могу создать / установить программное обеспечение во встроенную систему?

    команда для подсчета числа активных заданий cron в crontabs

    Как отключить вывод VLC в режиме командной строки?

    Разделение большого дерева каталогов по типу файла

    Найти и удалить

    Вызвать другие сценарии с исходным кодом и сделать условный условный оператор с операторами if

    Невозможно установить glibc и glibc-common, потому что они нужны друг другу

    ловушка на выходе команды не работает, если она не используется в функции или под-оболочке

    Ядро 4.10 / 4.12 с AMDGPU-PRO?

    Не удается войти в sftp

    libGLEW.so.1.11: невозможно открыть файл общих объектов

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

    Как генерировать графики из результатов lmbench?

    Вычислять хиты в течение промежутка времени из файла журнала

    Я единственный, кто имеет доступ к моей машине. Любые причины для включения прав группы / других файлов и каталогов?

    Linux и Unix - лучшая ОС в мире.