Come esportare variabili da un file?


80

Ho un tmp.txtfile contenente variabili da esportare, ad esempio:

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

Come posso esportare tutte queste variabili usando il exportcomando, in modo che possano essere successivamente utilizzate dai processi figlio?


1
bash --init-file somefile.blah -c "command"
Dillian Murphey

SO ha una risposta utile su come sorgente automatica dei .envfile quando ci si trova cdin una directory.
Dan Dascalescu il

@Neerav Ti preghiamo di accettare l'altra risposta. Questa è una soluzione molto migliore.
coderDude

Risposte:


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

A giudicare dall'altra domanda, non si desidera codificare i nomi delle variabili:

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

Provalo:

$ 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

2
Questo non funzionerà se il file di ambiente contiene commenti, ad esempio. (es. file che possono essere riutilizzati da Environmentdile di systemd)
Chris Lamb,

3
@ChrisLamb puoi usare grepper saltare i commenti:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee,

182
set -a
. ./tmp.txt
set +a

set -afa sì che le variabili¹ definite d'ora in poi vengano esportate automaticamente. È disponibile in qualsiasi shell tipo Bourne. .è il nome standard e Bourne per il sourcecomando, quindi lo preferisco per la portabilità ( sourceviene da cshed è ora disponibile nella maggior parte delle shell moderne simili a Bourne, anche bashse (a volte con un comportamento leggermente diverso)).

Nelle shell POSIX, puoi anche usarlo set -o allexportcome un modo alternativo più descrittivo per scriverlo ( set +o allexportper annullare l'impostazione).


¹ In bash, attenzione che provoca anche l' esportazione nell'ambiente di tutte le funzioni dichiarate mentre allexportè attiva (poiché BASH_FUNC_myfunction%%le variabili di ambiente che vengono quindi importate da tutte le bashshell vengono eseguite in quell'ambiente, anche quando vengono eseguite come sh).


1

Basta fare:

while read LINE; do export "$LINE"; done < ./tmp.txt

Hai controllato se funziona?
RalfFriedl,

@RalfFriedl dovrebbe funzionare, perché no? Non è molto elegante e l'approvvigionamento set -asarebbe molto più semplice, ma in realtà funziona.
Terdon

Questo è fragile. Non consente commenti nel file di input, non gestisce correttamente i valori delle variabili tra virgolette e ha esito negativo su variabili multilinea. Concesso che non ho molte variabili multilinea, ma uso regolarmente i commenti e spesso ho bisogno di usare le virgolette per i valori delle variabili.
Louis

Ha funzionato per me.
martedì
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.