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
.
sausource
, 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
.
sausource
. 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
spunesudo: 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 cusudo
. Vă sugerez să încercați să vă sursați scriptul și apoi să rulațisudo
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.