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 . eller source, 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 . eller source. 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äger sudo: 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 med sudo. Jag föreslår att du försöker källa till ditt skript och kör sedan sudo 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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *