Система не может обнаружить переименованные / новые файлы

Нет , функция не может иметь пустое тело между фигурными скобками в соответствующем приложении.


POSIX определяет команду определения функции как:

fname ( ) compound-command [io-redirect ...]

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

Составная команда определяется как один из нескольких элементов, включая циклы, условия и операторы case, но наиболее актуально здесь как команда группировки , который определяется в двух случаях :

(составной-список)

Выполнение составного-списка в среде подоболочки; см. Среда выполнения оболочки. Назначения переменных и встроенные команды, влияющие на среду, не должны оставаться в силе после завершения списка. ( ... отрывок об арифметическом раскрытии опущен ... )

{составной-список; }

Выполнить составной список в текущей среде процесса. Показанная здесь точка с запятой является примером оператора управления, ограничивающего зарезервированное слово}. Возможны и другие разделители, как показано в Грамматике оболочки; часто используется .

Пустое тело {\ n} было бы допустимым, если бы составной-список мог быть пустым.

Грамматика оболочки , в свою очередь, определяет правила синтаксического анализа командного языка оболочки, включая составной_лист :

 составной_лист: термин разрыва строки 
 | разделитель терминов переноса строки 
 

Это означает, что составной список представляет собой либо перенос строки , за которым следует термин , либо перенос строки , за которым следует терм и разделитель . разделитель - это ; или & . разрыв строки - это, возможно, пустая последовательность символов новой строки. Таким образом, он может быть пустым, если термин может быть пустым.

термин :

 термин: разделитель терминов and_or 
 | and_or 
 

и and_or :

 and_or: конвейер 
 | and_or AND_IF конвейер разрыва строки 
 | and_or OR_IF конвейер разрыва строки 
 

Последние две строки охватывают && и || . конвейер - это непустая последовательность команд , разделенных символами | . команда - это простая команда, составная команда или определение функции. Таким образом, term и command могут быть пустыми, если либо простые, либо составные команды могут быть пустыми.

Простая команда всегда включает одно из cmd_name , cmd_word или cmd_prefix . cmd_prefix - это либо перенаправление, либо назначение, необязательно присоединенное к другому префиксу. Два других разбиваются на WORD , лексему в грамматике, которая представляет собой непустую последовательность символов слова. Таким образом, простая команда никогда не бывает пустой.

Мы уже рассмотрели составные команды, но на этот раз давайте вернемся назад с точки зрения грамматики. Составная команда - это одна из фигурных скобок,подоболочка, для , while или до цикла , и if или случай . Все они содержат фиксированное слово (например, « вместо ») или ( или { как минимум. Таким образом, составная команда никогда не бывает пустой.

Таким образом, команда никогда не бывает пустой, поэтому pipeline никогда не бывает пустым, ни and_or , term , или complex_list . Это означает, что

{
}

не разрешен, и поэтому определение функции

a() {
}

также недействительно.


Все вышеперечисленное применимо для соответствующего переносимого сценария оболочки. zsh и ] ash могут по своему усмотрению расширять свои реализации для обработки недопустимых в противном случае скриптов, и выбранная ими реализация кажется разумной и удобной. Bash, ksh, dash и другие выбрали более минималистичный путь реализации того, что был обязательным. Все эти варианты являются совместимыми.

Переносимый сценарий всегда должен предоставлять непустое тело функции, но сценарий, ориентированный (скажем) только на zsh, этого не делает.

1
27.09.2017, 23:10
0 ответов

Теги

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