Jag har flera Amazon EC2-konton och vill snabbt kunna byta variabler, till exempel $EC2_HOME
, med ett skript.
Jag har ett skalskript inställt så här:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
När jag kör skriptet vet jag att EC2_HOME
är inställt, men jag trodde att användning av export
skulle få variabeln att hålla kvar efter att skriptet slutförts. Det gör det inte, eftersom körning av echo $EC_HOME
inte visar något.
Jag vet att detta måste vara mycket rudimentär Linux-skriptekunskap, men jag vet inte det. försökte leta efter relaterade frågor utan lycka – så jag ber om ursäkt om detta är en duplikat.
Svar
Du bör källa till ditt skript, med
. ./script
eller
source ./script
Kommentarer
- anledningen är att ditt skript skapar en ny skalprocess som ett barn i det aktuella skalet. Alla miljöförändringar du gör i barnprocessen kan inte påverka föräldern. När du använder
.
ellersource
, du leker inte en ny underordnad process, du kör kommandona i det aktuella skalet. - @glennjackman Jag har ett liknande problem och jag har provat din lösning men det loggar mig från skalet när jag gör
.
ellersource
. Varför är det här hap? pening? - @Patryk: kanske ditt skript har ett
exit
uttalande, så det är inte lämpligt att hämta. - Medan
source ./script
fungerar helt bra,sudo source ./script.sh
sägersudo: source: command not found
. Hur kan jag göra detta med sudo? - @ 71GA: beroende på kompileringsinställningar för
sudo
och beroende på konfigurationsinställningar i/etc/sudoers
du kan eller kan inte bevara din miljö när du kör kommandon medsudo
. Jag föreslår att du försöker källa till ditt skript och kör sedansudo
med-E
för att bevara miljön. Om det inte fungerar antar jag att det är väldigt lite du kan göra.
Svar
När du kör ett manus får sitt eget skal och sin egen miljö, som försvinner igen så snart manuset är klart. För att hålla miljövariablerna kvar, käll in skriptet i ditt nuvarande skal:
$ source ./a.sh
eller motsvarande (men lite mer bärbart) använd POSIX dot-kommando :
$ . ./a.sh
Då läggs definitionerna i din nuvarande skalmiljö och ärvs av alla program du startar från det.
För att vara närmare att köra ett skript, . a.sh
hittar a.sh genom att söka i katalogerna i PATH
miljövariabel.
Det finns några finesser i hur dessa beter sig, och om .
och source
är desamma (eller närvarande alls). . ./a.sh
kommer definitivt att uppträda detsamma i varje POSIX-kompatibelt skal, men source
och .
och . a.sh
och . ./a.sh
För Bash source
och .
är samma i alla fall; för zsh source
kontrollerar alltid den aktuella katalogen först ; ksh är i stort sett lika.
Om manusnamnet ges som en sökväg (som innehåller /
) används den sökvägen direkt i samtliga fall. Det mest pålitligt att göra är . ./script
eller . /path/to/script
.
Svar
Bara för rekord.
Om du vill köra skript från internet som exporterar env till systemet
kan du använda följande format
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
Till exempel:
source <(curl -s -L https://example.com/install.sh)
Kommentarer
- Ser farligt ut men användbart om du litar på det manuset!
Svar
Försök
exec ./script
exec-kommandot kör skriptet i det aktuella skalet utan att starta ett icke-interaktivt skal.