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/fd
está disponible, bash admite la sustitución de procesos:Aquí,
<( )
se expandirá a una ruta asignada automáticamente bajo la/dev/fd/...
cual./settings
se puede leer la salida de .fuente
O por supuesto ...
Pruébalo por supuesto ...
Manejo de espacios en blanco:
fuente
export
truco funciona! Graciasa backtick --> ` <--
and here's another one --> ` <--
source /dev/stdin < ./settings
Sin embargo, creo que / dev / stdin es una cosa única de Linux.
fuente
/dev/stdin
tambié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/stdin
truco, pero lo que hace su respuesta es, de hecho, equivalente a un planosource ./settings
sin 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