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

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

  • Руководство грамматики Баша
  • Сценарий оболочки для работы с файлами в некотором каталоге
  • Поиск файлов с использованием сценария оболочки
  • Как помещать вспомогательную оболочку и связанные с ней команды в фоновом режиме?
  • Какая команда (ы) будет кормить текстовый файл с разделителями табуляции и вырезать каждую строку до 80 символов?
  • Вставить новую строку со значением, когда значение не найдено вообще
  • Как копировать, выполнять и извлекать данные с удаленного компьютера?
  • Как безопасно отменить поиск dns на ip в сценарии оболочки
  • Как я могу получить доступ к столбцу строки из строки?
  • Как выполнить удаленный сценарий с помощью «экранов»?
  • Получить сменный путь диска по метке в сценарии bash
  • Interesting Posts

    Возможно ли, чтобы X проанализировал файл конфигурации для каждого пользователя?

    last -t в Linux

    Как создать список содержимого файла каталога и подкаталогов с созданием, добавлением, изменением и последним временем открытия для каждого файла?

    Как удалить том bcache0?

    Linux / Windows 8.1: установка на raid0

    SSH. Возможно ли, чтобы сеанс SSH полностью контролировал клиента?

    Почему этот процесс не закончится после SIGTERM

    eval используется с командой pipeed

    Установка uwsgi в Debian 6 (Squeeze) требует обновления libc6 и initscripts

    Является ли ссылка symlink относительно родительского каталога адресата, и если да, то почему?

    .ssh / config, чтобы указать распределение псевдо-tty и выполнение команды

    sed не соответствует шаблонам на границе слова в streamе

    Новые Tmux Panes идут в тот же каталог, что и текущая панель; новые окна tmux переходят в домашнюю директорию?

    Какова цель хеш-команды?

    защита паролем для сжатия logrotate

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