Un poco complicado para nombrar esto ...
Básicamente tengo un programa que cuando se ejecuta imprime en STDOUT un conjunto de variables de shell:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Quiero ejecutar esto desde un script de shell como si se estuviera evaluando el STDOUT source.
Me gustaría hacer algo como ...
source `./settings`
... pero por supuesto eso no funciona.
Sé que podría hacer:
./settings >/tmp/file
source /tmp/file
pero realmente no quiero hacer eso.
¿Alguna pista?

sh: podría ser un enlace simbólico a dash, ash, busybox ... No he visto una copia de "la verdadera 'sh'" en vivo.$( ), comenzando con el shell de Almquist en 4.3BSD , y también es POSIX. (Nota: sin discutir, solo curioso.)En los sistemas donde
/dev/fdestá disponible, bash admite la sustitución de procesos:Aquí,
<( )se expandirá a una ruta asignada automáticamente bajo la/dev/fd/...cual./settingsse puede leer la salida de .fuente
O por supuesto ...
Pruébalo por supuesto ...
Manejo de espacios en blanco:
fuente
exporttruco funciona! Graciasa backtick --> ` <--and here's another one --> ` <--source /dev/stdin < ./settingsSin embargo, creo que / dev / stdin es una cosa única de Linux.
fuente
/dev/stdintambién funciona en BSD y Cygwin.|, sin embargo, está no va a funcionar (al menos no exactamente), debido a que ambos lados de la tubería son subprocesos separados, de modo comandos de origen no afectarían a la shell actual./dev/stdintruco, pero lo que hace su respuesta es, de hecho, equivalente a un planosource ./settingssin ejecutarlo. Se podría utilizar un documento interno para superar esto:source /dev/stdin <<EOF \n $(./settings) \n EOF.Quería proporcionar otra perspectiva aquí, ya que las otras respuestas crean archivos y no extraen directamente de stdin. Tengo algunas compilaciones que necesitan enviar información del entorno preparada a varios scripts. Lo que estoy haciendo es preparar un montón de asignaciones de variables compatibles con Bash en una cadena:
Cuando me estoy preparando para ejecutar el script, codifico base64 la cadena multilínea anterior y la canalizo en mi script de shell:
En build.sh leí de stdin, decodifica base64 y evalué el resultado.
fuente