Не бей себя ушами по щекам!
Вопрос, который я задаю на собесах, возможно, с подвохом. Частенько ставит в ступор соискателей. Короче.
Есть два бесконечных Bash-цикла:
while :
do
done
while true
do
done
Вопрос: почему в первом случае используется «:», а во втором «true»?
И тут начинается… у людей включается JavaScript-мышление, и они начинают троить. Раз есть задача, значит, есть и разница в поведении, значит, будут какие-то разные ожидаемые результаты.
Рисуют мне какие-то формулы, строят гипотезы, даже пытаются доказать свою правоту и послать меня на хуй.
Ведь как происходит: пишешь ты годами Bash-скрипты и даже не задумываешься, а схренали я использую «:», а не «true»? Да потому что оно нахер не всралось про это думать, работает — и ок.
Команда «:» всегда возвращает 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
Мне очевиднее первый вариант: если не знать за «:», то словишь ступор. Такие дела. Изучай.








Комментарии