Пули закончатся раньше, чем ноги
Откопал сегодня в одном коммерческом интерпрайзе такую конструкцию:
while [ $(pgrep process_name)>'0' ]
do
sleep 5
done
Смотрю я в неё и понять не могу, а нахуя?
Давай разберёмся, что тут не так.
[ = это аналог или синоним встроенной команды test. Если не задавать оператор, то на пустой строке вернётся FALSE. Ну и логично, что вернётся TRUE, если строка не пустая.
while — ежу понятно, условный цикл. Будем вертеть на хуй, пока команда, заданная в условии, возвращает истину. В нашем случае эта команда — test.
pgrep — ищем процесс с именем process_name. Эта штука выводит на стандартный вывод PID процесса. Если процесс не найден, код возврата отличный от нуля, и ноль в противном случае.
$(command) — command запускается в подоболочке. Результат выполнения подставляется в текущую позицию.
> — перенаправляет результат работы команды в файл (в нашем случае файл 0). Существующий файл перезаписывается. Несуществующий будет создан.
Понял, в чём дело? Нет? Давай дальше…
test? Цикл и так является условным и сам проверяет, что вернула команда. Получается избыточность.Такое обычно херачат либо по привычке, либо когда нужно быстрое решение, а времени на ресерч нет. Работает, да и хрен с ним.
Вся эта конструкция могла бы выглядеть так:
while pgrep process_name &> /dev/null
do
sleep 5
done
Цикл будет шуршать, пока команда pgrep отрабатывает без ошибок и находит процесс.
Вот такая вот романтика, на хую два бантика… Изучай!








Комментарии