Anteriormente utilicé source
comandos como este:
source file_name
Pero lo que intento hacer es esto:
echo something | source
Lo que no funciona.
Anteriormente utilicé source
comandos como este:
source file_name
Pero lo que intento hacer es esto:
echo something | source
Lo que no funciona.
Respuestas:
Como source
(o .
) toma un archivo como argumento, podría intentar:
source <(echo something)
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 echo
bit 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/62
o 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/stdin
o 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 readlink
está leyendo desde una tubería anónima que se abre en el descriptor de archivo 63.