zsh принимает синтаксически некорректную конструкцию цикла

#zsh

Вопрос:

По ошибке я набрал что-то вроде этого:

 for f in a b; echo a; echo x  

Произведенная продукция была

 a a x  

как будто я написал

 for f in a b; do echo a; done; echo x  

Может ли кто-нибудь объяснить, почему мой код привел этот пример? Проверяя справочную страницу, она четко указывает, что требуемый синтаксис должен быть

для имени … [ в слове … ] список дел на срок завершен

Ни один короткий путь не объясняет, что я мог бы опустить do операционную done .

Я запускаю zsh 5.8

Ответ №1:

Несколько сбивает с толку то, что этот синтаксис не описан в разделе, в котором вводится for цикл. Вместо этого он указан вместе с некоторыми другими версиями коротких команд в отдельной части zshmisc справочной страницы под названием АЛЬТЕРНАТИВНЫЕ ФОРМЫ ДЛЯ СЛОЖНЫХ КОМАНД.

для имени … [ в слове … ] подсписок терминов
, где термин представляет собой по крайней мере одну новую строку или ;. Еще одна короткая форма для.

Во введении к разделу упоминаются некоторые предостережения:

Многие сложные команды zsh имеют альтернативные формы. Они нестандартны и, вероятно, не будут очевидны даже опытным программистам оболочки; их не следует использовать нигде, где бы не беспокоила переносимость кода оболочки.

Приведенные ниже короткие версии работают только в том случае, если подлист имеет форму «{список} » или если установлен параметр SHORT_LOOPS.

Комментарии:

1. Огромное спасибо. Это так странно, что мне это может понравиться. Кстати, если я когда-нибудь выпрыгну из окна в бешенстве, то это потому, что я пытаюсь получить какую-то отчаянно необходимую информацию с главной страницы zsh. Он содержит все, что нам нужно, но постоянно по частям, на которые мы не смотрим.