Comando de fonte de alimentação com um tubo

25

Anteriormente, usei sourcecomandos como este:

source file_name

Mas o que estou tentando fazer é o seguinte:

echo something | source

O que não funciona.

Desmond Hume
fonte

Respostas:

38

Como source(ou .) usa um arquivo como argumento, você pode tentar:

source <(echo something)
muru
fonte
11
Isso funcionou, obrigado. E feliz Ano Novo!
Desmond Hume
@muru Isso funciona muito bem. Observe que "| source / dev / stdin" tem a aparência de funcionar, mas na verdade eliminará todas as atribuições de variáveis. Não sei por que. Parece sólido em teoria. Isso é loucura.
Dustin Oprea
2
Os pipes do @DustinOprea criam um subshell, para que todas essas atribuições de variáveis ​​nunca afetem o shell pai.
Muru
8

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 echobit 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/62ou 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/stdinou 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 readlinkestá lendo de um tubo anômalo que é aberto no descritor de arquivo 63.

mikeserv
fonte