Anteriormente, usei source
comandos como este:
source file_name
Mas o que estou tentando fazer é o seguinte:
echo something | source
O que não funciona.
Anteriormente, usei source
comandos como este:
source file_name
Mas o que estou tentando fazer é o seguinte:
echo something | source
O que não funciona.
Respostas:
Como source
(ou .
) usa um arquivo como argumento, você pode tentar:
source <(echo something)
Seu comando de origem requer um argumento de arquivo. Você pode obter isso em alguns shells com uma substituição de processo, e isso ocorre 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, substitui o subshell por um arquivo nomeado - geralmente /dev/fd/62
ou algo assim - algum link para um descritor de arquivo. 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 bem em qualquer sistema Linux - e muitos outros além. Você também pode usar os documentos aqui da mesma forma:
. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI
Você pode verificar a maneira como seu shell lida com a substituição do processo, a propósito:
(set -x; readlink <(:))
... que imprime (in 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 tubo anômalo que é aberto no descritor de arquivo 63.