Грамматика оболочки POSIX по адресу http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10_02
говорит
pipe_sequence : command
| pipe_sequence '|' linebreak command
;
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
Это означает, что определение функции может быть термином в последовательности каналов. Как это возможно? Определение функции не может иметь стандартный ввод или вывод, и это не команда, которая может быть выполнена. Только вызов функции, который является простой командой, может быть выполнен.
Добавлено после первого комментария и ответа:
Если мы отделим здесь function_definition
от command
и добавим ее в качестве другой альтернативы, где бы ни появлялась command
, то да, мы немного усложним грамматику.
Но окупаемость гораздо важнее: реализация такой оболочки намного проще.
Потому что, если вы разрешаете определения функций в конвейере, вам приходится иметь дело с такими вопросами, как область действия функции и в какой среде она выполняется. Я не верю, что на такие вопросы вообще отвечают стандарт.
Что еще хуже: немного больше сложности в грамматике или гораздо больше работы и сложности для разработчика. Если первое, то разве это не случай "хвоста, виляющего собакой"?