Como source
(ou .
) usa um arquivo como argumento, você pode tentar:
source <(echo something)
Anteriormente, usei o comando source
da seguinte forma:
source file_name
Mas o que estou tentando fazer é isso:
echo something | source
O que não funciona.
Seu comando de origem requer um argumento de arquivo. Você pode conseguir isso em alguns shells com uma substituição de processo, e isso ocorre porque da mesma maneira que o shell substitui ...
arg=$(echo hi)
... o echo
bit lá na linha de comando com a saída do subshell, no caso de substituição de processo ele substitui o subshell por um arquivo nomeado - geralmente /dev/fd/62
ou algo assim - algum link para um arquivo- descritor. Com um pipe, o descritor de arquivo é 0, então ...
echo 'echo hi' | . /dev/fd/0
... /dev/stdin
ou qualquer que seja o caso, deve funcionar muito bem em qualquer sistema linux - e muitos outros além disso. Você também pode usar aqui-documentos de forma semelhante:
. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI
Você pode verificar como o seu shell lida com a substituição de processos, a propósito:
(set -x; readlink <(:))
... que imprime (em bash
) :
+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]
... e assim podemos ver que o shell está fazendo a substituição e readlink
está lendo de um canal anoymous que é aberto no descritor de arquivo 63.