Comando de fuente de alimentación con una tubería

25

Anteriormente utilicé sourcecomandos como este:

source file_name

Pero lo que intento hacer es esto:

echo something | source

Lo que no funciona.

Desmond Hume
fuente

Respuestas:

38

Como source(o .) toma un archivo como argumento, podría intentar:

source <(echo something)
muru
fuente
1
Eso funcionó, gracias. ¡Y feliz Año Nuevo!
Desmond Hume
@muru Esto funciona muy bien. Tenga en cuenta que "| source / dev / stdin" tiene la apariencia de funcionar, pero en realidad eliminará todas las asignaciones de variables. No estoy seguro de por qué. Parece sólido en teoría. Es una locura.
Dustin Oprea
2
Las tuberías @DustinOprea crean una subshell, por lo que todas esas asignaciones de variables nunca afectan la shell principal.
muru
8

Su comando de origen requiere un argumento de archivo. Puede obtener eso en algunos shells con una sustitución de proceso, y esto se debe a que de la misma manera que el shell reemplaza ...

arg=$(echo hi)

... el echobit allí en la línea de comandos con la salida del subshell, en el caso de la sustitución del proceso, reemplaza el subshell con un archivo con nombre, generalmente /dev/fd/62o algo, algún enlace a un descriptor de archivo. Con una tubería, el descriptor de archivo es 0, así que ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdino cualquiera que sea el caso, debería funcionar bien en cualquier sistema Linux, y muchos otros además. También puede usar documentos aquí de manera similar:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

Puede verificar la forma en que su shell maneja la sustitución del proceso, por cierto:

(set -x; readlink <(:))

... que imprime (en bash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... y así podemos ver que el shell está haciendo la sustitución y readlinkestá leyendo desde una tubería anónima que se abre en el descriptor de archivo 63.

mikeserv
fuente