Am mai multe conturi Amazon EC2 și vreau să pot schimba rapid variabile, cum ar fi $EC2_HOME un script.

Am un script shell configurat astfel:

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

Când rulez scriptul știu că EC2_HOME este setat, dar m-am gândit că folosirea export va face ca variabila să rămână în jur după finalizarea scriptului. Nu, deoarece rularea echo $EC_HOME nu arată nimic.

Știu că acest lucru trebuie să fie o cunoaștere foarte rudimentară a scripturilor Linux, dar nu o știu. Am încercat să caut întrebări conexe fără noroc – așa că îmi cer scuze dacă acesta este un duplicat.

Răspuns

Ar trebui să vă sursați scriptul, cu

. ./script 

sau

source ./script 

Comentarii

  • motivul este că scriptul dvs. generează un proces de shell nou ca un copil al shell-ului curent. Orice schimbări de mediu pe care le efectuați în procesul copil nu pot afecta părintele. Când utilizați . sau source, nu generați un proces copil nou, executați comenzile în shell-ul curent.
  • @glennjackman Am o problemă similară și am încercat soluția ta, dar mă deconectează de la shell când fac . sau source. De ce este acest lucru pening?
  • @Patryk: poate scriptul dvs. are o instrucțiune exit, deci nu este potrivit să fie obținută.
  • În timp ce source ./script funcționează complet bine, sudo source ./script.sh spune sudo: source: command not found. Cum pot face acest lucru folosind sudo?
  • @ 71GA: în funcție de preferințele de compilare pentru sudo și în funcție de setările de configurare din /etc/sudoers puteți sau nu vă puteți păstra mediul atunci când executați comenzi cu sudo. Vă sugerez să încercați să vă sursați scriptul și apoi să rulați sudo cu opțiunea -E pentru a păstra mediul. Dacă nu funcționează, presupun că puteți face foarte puțin.

Răspuns

Când rulați un script are propriul shell și propriul mediu, care dispar din nou imediat ce scriptul este terminat. Pentru a păstra variabilele de mediu în jur, introduceți scriptul în shell-ul curent:

$ source ./a.sh 

sau în mod echivalent (dar puțin mai portabil) utilizați Comanda POSIX punct :

$ . ./a.sh 

Apoi definițiile vor fi introduse în mediul curent al shell-ului și vor fi moștenite prin orice programe pe care le lansați din acesta.

Pentru a fi mai aproape de rularea unui script, . a.sh va găsi a.sh căutând directoare în PATH variabilă de mediu.


Există câteva subtilități în modul în care acestea se comportă și dacă . și source sunt aceleași (sau prezente deloc). . ./a.sh se va comporta cu siguranță la fel în fiecare shell compatibil POSIX, dar source și . și . a.sh și . ./a.sh, pot varia . Pentru Bash source și . sunt aceleași în toate cazurile; pentru zsh source verifică întotdeauna directorul curent mai întâi ; ksh este în esență similar.

Dacă numele scriptului este dat ca o cale (care conține un /), acea cale este utilizată direct în toate cazurile. Cel mai portabil lucru de făcut este . ./script sau . /path/to/script.

Răspuns

Doar pentru înregistrare.

Dacă doriți să rulați script de pe internet care exportă env în sistem

puteți utiliza următorul format

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

De exemplu:

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

Comentarii

  • Pare periculos, dar util dacă aveți încredere în acel script!

Răspundeți

Încercați

exec ./script 

Comanda exec execută scriptul în shell-ul curent fără a porni shell-ul non-interactiv.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *