Come posso rendere "esportate" le variabili di ambiente in uno script shell in giro?


54

Ho più account Amazon EC2 e voglio essere in grado di cambiare rapidamente le variabili, ad esempio $EC2_HOMEutilizzando uno script.

Ho uno script di shell impostato in questo modo:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Quando eseguo lo script so che EC2_HOMEè impostato, ma ho pensato che l'uso exportavrebbe fatto in modo che la variabile rimanesse bloccata dopo il completamento dello script. Non lo fa, poiché la corsa echo $EC_HOMEnon mostra nulla.

So che questa deve essere una conoscenza degli script Linux molto rudimentale, ma non lo so. Ho provato a cercare domande correlate senza fortuna, quindi mi scuso se questo è un duplicato.

Risposte:


60

Dovresti cercare la tua sceneggiatura, con

. ./script

o

source ./script

19
il motivo è che lo script genera un nuovo processo di shell come figlio della shell corrente. Qualsiasi modifica apportata all'ambiente nel processo figlio non può influire sul genitore. Quando usi .o source, non stai generando un nuovo processo figlio, stai eseguendo i comandi nella shell corrente.
Glenn Jackman,

1
@glennjackman Ho un problema simile e ho provato la tua soluzione ma quando lo faccio .o mi disconnette dalla shell source. Perché sta succedendo ?
Patryk,

7
@Patryk: forse la tua sceneggiatura ha una exitdichiarazione, quindi non è adatta per essere approvata.
enzotib,

Mentre source ./scriptfunziona completamente bene, sudo source ./script.shdice sudo: source: command not found. Come posso farlo usando sudo?
71GA,

1
@ 71GA: a seconda delle preferenze di compilazione sudoe in base alle impostazioni di configurazione in cui /etc/sudoersè possibile o meno preservare l'ambiente quando si eseguono comandi con sudo. Ti suggerisco di provare a procurarti il ​​tuo script e quindi eseguirlo sudocon l' -Eopzione per preservare l'ambiente. Se non funziona, suppongo che ci sia molto poco che puoi fare.
enzotib,

36

Quando esegui uno script, ottiene la sua shell e il suo ambiente, che scompaiono non appena lo script è finito. Per mantenere le variabili di ambiente in giro, procedi allo script nella shell corrente:

$ source ./a.sh

o in modo equivalente (ma un po 'più portabile) utilizzare il comando punto POSIX :

$ . ./a.sh

Quindi le definizioni verranno inserite nell'ambiente della tua shell corrente e saranno ereditate da tutti i programmi che avvierai da essa.

Per essere più vicini all'esecuzione di uno script, . a.shtroverai a.sh cercando le directory nella PATHvariabile d'ambiente.


Ci sono alcune sottigliezze nel modo in cui si comportano e se .e sourcesono uguali (o presenti). . ./a.shsi comporterà sicuramente lo stesso in ogni shell compatibile con POSIX, ma sourcee ., e . a.she . ./a.sh, può variare. Per Bash sourcee .sono gli stessi in tutti i casi; per zsh sourcecontrolla sempre prima la directory corrente ; ksh è essenzialmente simile.

Se il nome dello script viene indicato come percorso (contenente a /), tale percorso viene utilizzato direttamente in tutti i casi. La cosa più portabilmente affidabile da fare è . ./scripto . /path/to/script.


1

Solo per la cronaca.

Se si desidera eseguire script da Internet che esporta env nel sistema

puoi usare il seguente formato

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Per esempio:

source <(curl -s -L https://example.com/install.sh)

Sembra pericoloso ma utile se ti fidi di quella sceneggiatura!
Mark Stewart,
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.