Suspeito que você tenha duas versões de bash em seu sistema e que, quando estiver chamando bash -c '' , esteja invocando uma versão diferente. Isso ou seu código foi alterado quando você criou a pergunta.
Quanto a por que eu acho isso, seu código não funciona no meu sistema:
$ test() { echo foo |sed -r s/.*(.)/\1/g; }
bash: syntax error near unexpected token '('
O problema é que você não tem aspas em torno da expressão sed , então o bash está tentando interpretá-lo como uma expressão shell. Eu estou supondo que este comportamento mudou entre as versões bash, e que o seu shell de login é uma versão diferente de bash do que o que está no seu $PATH ao chamar bash -c '' .
Você pode verificar isso fazendo:
$ echo $SHELL
$ which bash
Outra possível causa seria se você tivesse algumas opções de shell configuradas que estivessem alterando o comportamento da avaliação de expressão do bash, e essas opções não estão sendo usadas pelo bash -c '' .
Quanto a como corrigir o problema, quando eu cito corretamente a expressão sed , tudo funciona bem:
$ test() { echo foo | sed 's/.*\(.\)//g'; }
$ export -f test
$ bash -c 'test'
o
(Nota: eu tive que ajustar levemente o comando sed , pois não é um comando válido para a minha versão do sed )