Uma definição de função só tem um efeito na instância atual do bash. Quando você escreve
echo "myfunction ." | bash
você executa outra instância do bash. Você precisaria definir a função nessa outra instância.
Se você tiver uma string que contenha um nome de função e argumentos (citados, se necessário), ou mais geralmente qualquer string que contenha algum código-fonte de shell que você queira executar, use o eval
builtin.
my_snippet='myfunction .'
eval "$my_snippet"
Se você definir funções em seu .bashrc
, elas estarão disponíveis apenas em shells interativos, não em scripts.
O comando .
é (quase) equivalente a source
e não tem nada a ver com .
que significa o diretório atual.