Há uma boa razão para isso não funcionar:
echo anything | source test.sh
É porque o acima é um pipeline. Consequentemente, source test.sh é executado em uma subcamada. Isso significa que qualquer variável de ambiente criada é descartada quando sua execução é concluída.
A solução para o seu problema é:
source test.sh < <(echo anything)
Com essa abordagem, source test.sh é executado no shell principal. Seu stdin é redirecionado de echo anything usando substituição de processo .
O primeiro < redireciona stdin. O segundo < é parte da construção <(...) que cria um substituição de processos . Pelo menos um espaço entre o primeiro e o segundo < é necessário.