Ho più account Amazon EC2 e desidero poter cambiare rapidamente variabili, come $EC2_HOME
, utilizzando 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 luso di export
avrebbe fatto sì che la variabile rimanesse ferma dopo il completamento dello script. Non lo fa, poiché lesecuzione di echo $EC_HOME
non mostra nulla.
So che questa deve essere una conoscenza di scripting Linux molto rudimentale, ma non lo so. Io ho provato a cercare domande correlate senza fortuna, quindi mi scuso se si tratta di un duplicato.
Risposta
Dovresti trovare il tuo script, con
. ./script
o
source ./script
Commenti
- il motivo è che il tuo script genera un nuovo processo di shell come figlio della shell corrente. Qualsiasi modifica allambiente che fai nel processo figlio non può influenzare il genitore. Quando usi
.
osource
, non stai generando un nuovo processo figlio, stai eseguendo i comandi nella shell corrente. - @glennjackman Ho un problema simile e ho provato la tua soluzione ma mi disconnette dalla shell quando faccio
.
osource
. Perché è successo pening? - @Patryk: forse il tuo script ha unistruzione
exit
, quindi non è adatto per essere reperito. - Mentre
source ./script
funziona perfettamente,sudo source ./script.sh
dicesudo: source: command not found
. Come posso farlo utilizzando sudo? - @ 71GA: a seconda delle preferenze di compilazione per
sudo
e in base alle impostazioni di configurazione in/etc/sudoers
puoi o non puoi preservare il tuo ambiente quando esegui comandi consudo
. Ti suggerisco di provare a creare il tuo script, quindi eseguiresudo
con lopzione-E
per preservare lambiente. Se non funziona, suppongo che tu possa fare molto poco.
Rispondi
Quando esegui uno script ottiene la propria shell e il proprio ambiente, che scompaiono di nuovo non appena lo script è terminato. Per mantenere le variabili di ambiente in giro, inserisci lo script nella tua shell corrente:
$ source ./a.sh
o in modo equivalente (ma un po più portabile) usa POSIX dot command :
$ . ./a.sh
Quindi le definizioni verranno inserite nellambiente della tua shell corrente e verranno ereditate da qualsiasi programma avviato da esso.
Per essere più vicino allesecuzione di uno script, . a.sh
troverà a.sh cercando le directory in PATH
variabile di ambiente.
Ci sono alcune sottigliezze nel modo in cui si comportano e se .
e source
sono uguali (o presenti del tutto). . ./a.sh
si comporterà sicuramente allo stesso modo in ogni shell compatibile con POSIX, ma source
e .
e . a.sh
e . ./a.sh
possono variare . Per Bash source
e .
sono gli stessi in tutti i casi; per zsh source
controlla sempre prima la directory corrente ; ksh è essenzialmente simile.
Se il nome dello script è dato come un percorso (contenente un /
), quel percorso viene utilizzato direttamente in tutti i casi. La cosa più affidabile da fare è . ./script
o . /path/to/script
.
Risposta
Solo per la cronaca.
Se vuoi eseguire uno script da Internet che esporti env nel sistema
puoi usare il seguente formato
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
Ad esempio:
source <(curl -s -L https://example.com/install.sh)
Commenti
- Sembra pericoloso ma utile se ti fidi di quello script!
Rispondi
Prova
exec ./script
Il comando exec esegue lo script nella shell corrente senza avviare la shell non interattiva.