Posso esportare una variabile nell'ambiente da uno script bash senza acquistarla?


282

Supponiamo che io abbia questo script

export.bash :

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

Quando eseguo lo script e provo ad accedere a $VAR, non ottengo alcun valore!

echo $VAR

C'è un modo per accedere al $VARsolo eseguendo export.bash senza acquistarlo?


1
Potresti provare a usare un alias invece di uno script per definire la tua variabile.
jdigital,

Lo script su cui sto lavorando, è una specie di gestore virtuale Java, faccio un po 'di calcolo, quindi dovrei esportare un $ JAVA_HOME nell'ENV e aggiungerlo a PATH.
Tarrsalah,

Bene, potresti scrivere le informazioni in un file e poi rileggerle, ma l'approvvigionamento sembra molto più semplice.
jdigital,

7
i processi figlio non possono alterare l'ambiente dei loro genitori. Il genitore deve scegliere di modificarsi (con sourceo evalo ...)
glenn jackman,

1
Per leggere di più sulla fonte, man sourcenon funzionerà perché sourceè integrato in bash, è necessario eseguirehelp source
peterchaula

Risposte:


319

Esiste un modo per accedere al $VARsolo eseguendo export.bashsenza approvvigionamento?

Risposta rapida: No.

Ma ci sono diverse possibili soluzioni.

Il più ovvio, che hai già menzionato, è usare sourceo .eseguire lo script nel contesto della shell chiamante:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

Un altro modo è avere lo script, anziché impostare una variabile d'ambiente, comandi di stampa che imposteranno la variabile d'ambiente:

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

Un terzo approccio consiste nell'avere uno script che imposta internamente le variabili di ambiente e quindi invoca un comando specificato con quell'ambiente:

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

Quest'ultimo approccio può essere abbastanza utile, anche se è scomodo per l'uso interattivo poiché non ti dà le impostazioni nella tua shell corrente (con tutte le altre impostazioni e cronologia che hai creato).


57

Al fine di esportare prima la variabile VAR, il modo più logico e sembra funzionare è di generare la variabile:

. ./export.bash

o

source ./export.bash

Ora, quando riecheggia dalla shell principale, funziona

 echo $VAR
HELLO, VARABLE

Ora ripristineremo VAR

export VAR=""
echo $VAR

Ora eseguiremo uno script per generare la variabile, quindi disinserirla:

./test-export.sh 
HELLO, VARABLE
--
.

il codice: cat test-export.sh

    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable 
    unset VAR
    # echo a few dotted lines
    echo "---"
    # now return VAR which is blank
    echo $VAR

Ecco un modo

NOTA BENE: le esportazioni sono limitate allo script che esegue le esportazioni nella tua console principale - quindi per quanto riguarda un cron job lo aggiungerei come la console come sotto ... per la parte di comando ancora discutibile: ecco come corri dalla tua shell:

Al prompt dei comandi (purché export.bash abbia più valori di eco)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

cat v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

Ora, fintanto che questo è per il tuo utilizzo, puoi rendere le variabili disponibili per i tuoi script in qualsiasi momento facendo un alias bash come questo:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

aggiungi questo al tuo .bashrc

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do  export $entries;  done; 

    "$@"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done

}

fonte il tuo file bashrc e puoi fare come sopra in qualsiasi momento ...

Comunque torniamo al resto ...

Ciò lo ha reso disponibile a livello globale, quindi ha eseguito lo script.

semplicemente echo fuori quindi esegui l'esportazione sull'eco!

cat export.bash

#!/bin/bash
echo "VAR=HELLO THERE"

Ora all'interno dello script o della console in esecuzione:

 export "$(./export.bash)"

Provare:

echo $VAR
HELLO THERE

Valori multipli finché sai cosa ti aspetti in un altro script usando il metodo sopra:

cat export.bash

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

cat test-export.sh

#!/bin/bash

IFS=$'\n'
for entries in $(./export.bash); do
   export $entries
done

echo "round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

Adesso i risultati

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.

e l'ultimo aggiornamento finale da assegnare automaticamente legge le VARIABILI:

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back

Lo script: cat test-export.sh

#!/bin/bash

IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 export $entries
 eval current_variable=\$$variable
 echo "\$$variable has value of $current_variable"
done


echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1

Voglio esportare VAR eseguendo il file, non acquistandolo.
Tarrsalah,

@vahid dovresti spiegare cosa sta facendo la tua sceneggiatura.
FDinoff,

1
perché non disinserire la variabile dopo l'approvvigionamento? sarà molto più facile del dolore che provi a causare a te stesso aggiornerà lo script test-export
VH

Ho dato un modo alternativo di farlo Tarrsalah
VH,

ok aggiornamenti finali - problemi con il metodo suggerito e aggirare l'idea di alias bashrc probabilmente sarebbe un ottimo modo per andare avanti
VH

22

Eseguire

set -o allexport

Qualsiasi variabile che si ottiene da un file dopo questo verrà esportata nella shell.

source conf-file

Quando hai finito esegui. Questo disabiliterà la modalità allexport.

set +o allexport

7
L'intero punto della domanda è "Come esportare senza fonte". Questa risposta usa la fonte.
Gonen I,

@ekkis Sì, non risponde esattamente alla domanda, ma ogni volta che ho cercato su Google come esportare variabili da un file questo thread veniva fuori. Quindi l'ho messo lì per me.
mdornfe1,

Semplice e facile da usare. questo dovrebbe essere contrassegnato come risposta.
QkiZ,

1
Ho valutato questo perché la dichiarazione del problema originale mi ha portato a capire che questa era la mia soluzione fondamentale. Ci sono documenti ufficiali su allexport qui: gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
benjaoming

ahh, +1. Questa domanda è il miglior risultato della parola chiave bash source exportin Google
ttimasdf

14

Trovato un modo interessante e pulito per esportare le variabili di ambiente da un file:

in env.vars:

foo=test

test script:

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => 

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# a better one
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

7

Un'altra soluzione alternativa che, a seconda del caso, potrebbe essere utile: creare un altro bash che eredita la variabile esportata. È un caso particolare della risposta di @Keith Thompson, con tutti questi inconvenienti.

export.bash:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

Adesso:

./export.bash
echo $VAR

Sei sicuro che quello che hai scritto funzioni !? Credo che devi eseguire il comando di linea:. ./export.bash
Sir Jo Black

@Sir Jo Black, sì, certo. L'ultima riga del file export.bash viene invocata bashcome figlio della shell corrente. E poiché è VARstato esportato prima, quell'invocazione includerà la variabile. Naturalmente, se si digita exitla VARsi spegne. Hai controllato?
Gonmator,

Ok! Non ho visto quell'invocazione ...: p
Sir Jo Black,

1

La risposta è no, ma per me ho fatto quanto segue

lo script: myExport

#! \bin\bash
export $1

un alias nel mio .bashrc

alias myExport='source myExport' 

Comunque lo procuri, ma forse in questo modo è più utilizzabile ed è interessante per qualcun altro.


1

Forse puoi scrivere una funzione in ~ / .zshrc, ~ / .bashrc.

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

Poiché la variabile d'uso è esterna, è possibile evitare di scrivere il file di script.

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.