Не бей себя ушами по щекам!

Вопрос, который я задаю на собесах, возможно, с подвохом. Частенько ставит в ступор соискателей. Короче.

Есть два бесконечных Bash-цикла:

while :
do
done
while true
do
done

Вопрос: почему в первом случае используется «:», а во втором «true»?

И тут начинается… у людей включается JavaScript-мышление, и они начинают троить. Раз есть задача, значит, есть и разница в поведении, значит, будут какие-то разные ожидаемые результаты.

Рисуют мне какие-то формулы, строят гипотезы, даже пытаются доказать свою правоту и послать меня на хуй.

Ведь как происходит: пишешь ты годами Bash-скрипты и даже не задумываешься, а схренали я использую «:», а не «true»? Да потому что оно нахер не всралось про это думать, работает — и ок.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
На самом деле эти циклы делают одно и то же. Объяснение простое.

Команда «:» всегда возвращает 0. Да, «:» — это команда, попробуй её запустить, а следом выполнить echo $? и получишь 0.

Это пустая команда, которая ничего не делает и всегда завершается успехом. Её используют там, где в синтаксисе скрипта требуется какая-либо команда.

Для while справедливо требуется продолжение, вот мы и продолжаем с помощью «:», чтобы интерпретатор не засыпал ошибками. Этакая заглушка для синтаксической корректности.

Ну а так как true тоже команда и всегда возвращает статус 0, получается, что «:» и true идентичны. Просто написать двоеточие намного быстрее.

Хотя, с другой стороны, если писать true, то код становится более читаемым.

Ноги растут из древних Bourne Shell, где не было встроенных команд ни true, ни false. Использовали именно «:».

Получается, «:» — легаси? Ну, можно и так сказать. Если хочешь, чтобы твои скрипты работали в древних оболочках, используй «:». А если похер, то делай true.

Вот что лучше читается?

if true; then
    echo "hello bashdays"
fi
if :; then
    echo "hello bashdays"
fi

Мне очевиднее первый вариант: если не знать за «:», то словишь ступор. Такие дела. Изучай.