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 . eller source, 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 . eller source. 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 sier sudo: 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 med sudo. Jeg foreslår at du prøver å hente skriptet ditt, og deretter kjører sudo 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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *