¿Cómo exportar variables desde un archivo?

80

Tengo un tmp.txtarchivo que contiene variables para exportar, por ejemplo:

a=123
b="hello world"
c="one more variable"

¿Cómo puedo exportar todas estas variables usando el exportcomando, para que luego puedan ser utilizadas por procesos secundarios?

Neerav
fuente
1
bash --init-file somefile.blah -c "command"
Dillian Murphey
SO tiene una respuesta útil sobre cómo obtener automáticamente los .envarchivos cuando ingresas cda un directorio.
Dan Dascalescu
@Neerav Por favor, acepte la otra respuesta. Esa es una solución mucho mejor.
coderDude

Respuestas:

65
source tmp.txt
export a b c
./child ...

A juzgar por su otra pregunta, no desea codificar los nombres de las variables:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

Pruébalo:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable
Glenn Jackman
fuente
2
Esto no funcionará si el archivo de entorno contiene comentarios, por ejemplo. (p. ej., archivos que pueden ser reutilizados por el archivo Environment de systemd)
Chris Lamb
3
@ChrisLamb puede usar greppara omitir comentarios:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee
182
set -a
. ./tmp.txt
set +a

set -ahace que las variables definidas a partir de ahora se exporten automáticamente Está disponible en cualquier shell tipo Bourne. .es el nombre estándar y Bourne para el sourcecomando, por lo que lo prefiero para la portabilidad ( sourceproviene cshy ahora está disponible en la mayoría de los shells modernos de Bourne, incluyendo bash(a veces con un comportamiento ligeramente diferente)).

En shells POSIX, también puede usarlo set -o allexportcomo una forma alternativa más descriptiva de escribirlo ( set +o allexportpara desarmar).


¹ En bash, tenga en cuenta que también hace que todas las funciones declaradas mientras allexportestá activado se exporten al entorno (ya que BASH_FUNC_myfunction%%las variables de entorno que luego importan todos los bashshells se ejecutan en ese entorno, incluso cuando se ejecutan como sh).

Stéphane Chazelas
fuente
1

Solo haz:

while read LINE; do export "$LINE"; done < ./tmp.txt
benjamin berhault
fuente
¿Verificaste si eso funciona?
RalfFriedl
@RalfFriedl esto debería funcionar, ¿por qué no? No es muy elegante y el abastecimiento set -asería mucho más simple, pero esto realmente funciona.
terdon
Esto es frágil No permite comentarios en el archivo de entrada, no maneja los valores de las variables citadas correctamente y falla en las variables de varias líneas. Por supuesto, no tengo muchas variables de varias líneas, pero uso comentarios regularmente y a menudo necesito usar comillas para los valores de las variables.
Louis
Funcionó para mi.
mchawre