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 . o source, 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 . o source. 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 dice sudo: 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 con sudo. Ti suggerisco di provare a creare il tuo script, quindi eseguire sudo 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *