Вместо использования eval вы можете export выполнить свою функцию, чтобы она была унаследована подоболочками:
myfunction () { ls -R "$1" ; }
export -f myfunction
И тогда работает
echo "myfunction ." | bash
. [ ! d2]
echo "myfunction ." | sh, вероятно, не будет, если ваш / bin / sh не является символической ссылкой на bash.