Jeg har flere Amazon EC2-kontoer og vil raskt kunne bytte variabler, for eksempel $EC2_HOME
, ved hjelp av et skript.
Jeg har satt opp et skallskript slik:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
Når jeg kjører skriptet vet jeg at EC2_HOME
er satt, men jeg trodde at bruk av export
ville få variabelen til å holde seg fast etter at skriptet ble fullført. Det gjør det ikke, ettersom å kjøre echo $EC_HOME
ikke viser noe.
Jeg vet at dette må være veldig rudimentær Linux-skriptekunnskap, men jeg vet ikke det. prøvde å lete etter beslektede spørsmål uten hell – så beklager jeg hvis dette er et duplikat.
Svar
Du bør hente skriptet ditt, med
. ./script
eller
source ./script
Kommentarer
- årsaken er at skriptet ditt gir en ny skallprosess som barn av det nåværende skallet. Eventuelle miljøendringer du gjør i barneprosessen kan ikke påvirke foreldrene. Når du bruker
.
ellersource
, du gyter ikke en ny underordnet prosess, du kjører kommandoene i gjeldende skall. - @glennjackman Jeg har et lignende problem, og jeg har prøvd løsningen din, men den logger meg av fra skallet når jeg gjør
.
ellersource
. Hvorfor er det slik? pening? - @Patryk: kanskje skriptet ditt har en
exit
uttalelse, så det er ikke egnet å bli hentet. - Mens
source ./script
fungerer helt greit,sudo source ./script.sh
siersudo: source: command not found
. Hvordan kan jeg gjøre dette ved hjelp av sudo? - @ 71GA: avhengig av kompileringspreferanser for
sudo
og avhengig av konfigurasjonsinnstillinger i/etc/sudoers
du kan eller kan ikke bevare miljøet ditt når du kjører kommandoer medsudo
. Jeg foreslår at du prøver å hente skriptet ditt, og deretter kjørersudo
med-E
for å bevare miljøet. Hvis det ikke fungerer, antar jeg at det er veldig lite du kan gjøre.
Svar
Når du løper et skript får det sitt eget skall og sitt eget miljø, som forsvinner igjen så snart skriptet er ferdig. For å holde miljøvariablene rundt, kalt skriptet til det nåværende skallet:
$ source ./a.sh
eller tilsvarende (men litt mer bærbart) bruk POSIX dot-kommando :
$ . ./a.sh
Da blir definisjonene satt i ditt nåværende skallmiljø og arvet av alle programmer du starter fra det.
For å være nærmere å kjøre et skript, vil . a.sh
finne a.sh ved å søke i katalogene i PATH
miljøvariabel.
Det er noen finesser i hvordan disse oppfører seg, og om .
og source
er de samme (eller i det hele tatt til stede). . ./a.sh
vil definitivt oppføre seg likt i alle POSIX-kompatible skall, men source
og .
, og . a.sh
og . ./a.sh
, kan variere For Bash source
og .
er de samme i alle tilfeller; for zsh source
sjekker alltid den aktuelle katalogen først ; ksh er i hovedsak lik.
Hvis manusnavnet er gitt som en bane (som inneholder /
), brukes den banen direkte i alle tilfeller. Det mest pålitelig å gjøre er . ./script
eller . /path/to/script
.
Svar
Bare for registrering.
Hvis du vil kjøre skript fra internett som eksporterer env til system
, kan du bruke følgende format
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
For eksempel:
source <(curl -s -L https://example.com/install.sh)
Kommentarer
- Ser farlig ut, men nyttig hvis du stoler på skriptet!
Svar
Prøv
exec ./script
exec-kommandoen kjører skriptet i gjeldende skall uten å starte et ikke-interaktivt skall.