Вопрос по bash – «While:» против «while true» [дубликат]

86

На этот вопрос уже есть ответ:

Какова цель: (двоеточия) встроенного GNU Bash? 11 ответов

Когда вы смотрите на то, как должны быть реализованы бесконечные циклы, вы в основном видите такой подход:

while :
do
  # loop infinitely
done

Но я просто не понимаю, как использовать: Вот. Не лучше ли использовать:

while true
do
  # loop infinitely
done

?

Не нужно двоеточия послеtrue, как: - это команда, а не синтаксис. chepner

Ваш Ответ

2   ответа
61

: [аргументы] Нет эффекта; команда не делает ничего, кроме расширения аргументов и выполнения любых указанных перенаправлений. Возвращается нулевой код выхода.

Поскольку это всегда возвращает ноль, следовательно, это похоже на использование в качествеtrue

Проверьте этот ответ: Какова цель `: '(двоеточие) GNU Bash Builtin?

21

встроенная команда, который ничего не делает, но возвращает 0 (успех). Таким образом, это короче (и быстрее), чем вызов фактической команды, чтобы сделать то же самое.

Разница не имеет ничего общего с командами против встроенных, так как они оба встроенные. Это просто дополнительное количество символов, с которыми имеет дело bash.while : some gibberish, все еще использую: медленнее чемtrue. Сравните это с внешней командой, например,while /bin/true, что буквально в сто раз медленнее. that other guy
@ thatotherguy, почти все мои глубокие знания связаны со скомпилированными языками - действительно ли интерпретатор пересматривает все так, как будто видит его впервые? Я бы подумал, что, по крайней мере, псевдонимы, такие как: будет заменен при первом обнаружении. Является ли ожидаемый сценарий чем-то вроде псевдонима или пути, изменяющегося в середине выполнения? Я бы ожидалwhile $(echo true) ... отложить, но никогдаwhile /bin/true -- если/bin/true были обнаружены пропавшие без вести, это потерпит неудачу без необходимости повторной интерпретации. John P
Это верно.i=0; time while true; do ((i++>100000)) && break; done занимает немного больше времени, чем версия с двоеточием. Dennis Williamson
Я нашел этот вопрос после красной сельди из-за различий междуwhile true а такжеwhile 1 - получается1 имеет псевдонимcd - который явно проходил, но печатал~ (мой cwd в то время.) Одна оговорка с: Я заметил, попробовав это: обычные правила применяются к:, поэтому вам нужно завершить его точкой с запятой (или переводом строки в случаях, подобных этому, когда у вас есть незакрытый блок.) Итак, для однострочного вы должны написатьwhile :; do ...; done в отличие отwhile :\n do ...\n done. На самом деле это вряд ли предостережение. John P

Похожие вопросы