Na verdade, é mais fácil para o implementador não ter que se preocupar com isso. Ao fazer um pipe, cada componente é executado em seu próprio subshell (exceto talvez o primeiro no bash, ou o último no ksh88 / ksh93 se o comando for nativo). Assim, a definição da função no meio de um pipeline seria definida para a instância do shell para esse componente do pipe, mas não visível para fora ... e isso é tudo automático com base na semântica dos pipelines.
Se você quisesse evitar definições de funções (ou definições de alias, ou comandos tolos como cd
...) dentro de um pipeline, então você complicou a implementação: -)