Пули закончатся раньше, чем ноги

Откопал сегодня в одном коммерческом интерпрайзе такую конструкцию:

while [ $(pgrep process_name)>'0' ]
do
 sleep 5
done

Смотрю я в неё и понять не могу, а нахуя?

Давай разберёмся, что тут не так.

[ = это аналог или синоним встроенной команды test. Если не задавать оператор, то на пустой строке вернётся FALSE. Ну и логично, что вернётся TRUE, если строка не пустая.

while — ежу понятно, условный цикл. Будем вертеть на хуй, пока команда, заданная в условии, возвращает истину. В нашем случае эта команда — test.

pgrep — ищем процесс с именем process_name. Эта штука выводит на стандартный вывод PID процесса. Если процесс не найден, код возврата отличный от нуля, и ноль в противном случае.

$(command) — command запускается в подоболочке. Результат выполнения подставляется в текущую позицию.

> — перенаправляет результат работы команды в файл (в нашем случае файл 0). Существующий файл перезаписывается. Несуществующий будет создан.

Понял, в чём дело? Нет? Давай дальше…

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Вопрос — нахуя здесь test? Цикл и так является условным и сам проверяет, что вернула команда. Получается избыточность.

Такое обычно херачат либо по привычке, либо когда нужно быстрое решение, а времени на ресерч нет. Работает, да и хрен с ним.

Вся эта конструкция могла бы выглядеть так:

while pgrep process_name &> /dev/null
do
 sleep 5
done

Цикл будет шуршать, пока команда pgrep отрабатывает без ошибок и находит процесс.

Вот такая вот романтика, на хую два бантика… Изучай!