Comando de origem de feed com um pipe

19

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.

    
por Desmond Hume 31.12.2014 / 21:47

2 respostas

29

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

source <(echo something)
    
por 31.12.2014 / 21:50
8

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.

    
por 31.12.2014 / 21:54

Tags