Jeg har flere Amazon EC2-konti og vil hurtigt kunne skifte variabler, f.eks. $EC2_HOME, ved hjælp af et script.

Jeg har et shell-script oprettet som dette:

#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME 

Når jeg kører scriptet, ved jeg, at EC2_HOME er indstillet, men jeg troede, at brug af export ville få variablen til at holde fast, når scriptet var afsluttet. Det gør det ikke, da kørsel af echo $EC_HOME ikke viser noget.

Jeg ved, at dette må være meget rudimentær Linux-scripting-viden, men jeg ved det ikke. forsøgte at søge efter relaterede spørgsmål uden held – så undskyld, hvis dette er en duplikat.

Svar

Du skal hente dit script, med

. ./script 

eller

source ./script 

Kommentarer

  • årsagen er, at dit script gyder en ny shell-proces som barn af den aktuelle shell. Ethvert miljøændringer, du foretager i underprocessen kan ikke påvirke forældren. Når du bruger . eller source, du gyder ikke en ny underordnet proces, du kører kommandoerne i den aktuelle shell.
  • @glennjackman Jeg har et lignende problem, og jeg har prøvet din løsning, men det logger mig fra shell, når jeg . eller source. Hvorfor er det her? pening?
  • @Patryk: måske har dit script en exit -erklæring, så det er ikke egnet til at blive hentet.
  • Mens source ./script fungerer helt fint, sudo source ./script.sh siger sudo: source: command not found. Hvordan kan jeg gøre dette ved hjælp af sudo?
  • @ 71GA: afhængigt af kompileringsindstillinger for sudo og afhængigt af konfigurationsindstillinger i /etc/sudoers du kan eller kan ikke bevare dit miljø, når du kører kommandoer med sudo. Jeg foreslår, at du prøver at kilde dit script og derefter kører sudo med -E mulighed for at bevare miljøet. Hvis det ikke virker, formoder jeg, at der er meget lidt, du kan gøre.

Svar

Når du løber et script får det sin egen skal og sit eget miljø, som forsvinder igen, så snart scriptet er færdigt. For at holde miljøvariablerne omkring skal du kilde scriptet til din nuværende shell:

$ source ./a.sh 

eller tilsvarende (men lidt mere bærbart) skal du bruge POSIX dot-kommando :

$ . ./a.sh 

Derefter sættes definitionerne i dit nuværende shell-miljø og arves af alle programmer, du starter fra det.

For at være tættere på at køre et script, finder . a.sh a.sh ved at søge i mapperne i PATH miljøvariabel.


Der er nogle finesser i, hvordan disse opfører sig, og om . og source er de samme (eller overhovedet til stede). . ./a.sh opfører sig bestemt det samme i hver POSIX-kompatibel shell, men source og . og . a.sh og . ./a.sh For Bash source og . er de samme i alle tilfælde; for zsh source kontrollerer altid den aktuelle mappe først ; ksh er stort set ens.

Hvis scriptnavnet er angivet som en sti (der indeholder en /), bruges stien direkte i alle tilfælde. Den mest bærbare pålidelige ting at gøre er . ./script eller . /path/to/script.

Svar

Bare for optagelse.

Hvis du vil køre script fra internettet, der eksporterer env til systemet

kan du bruge 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 farligt ud, men nyttigt, hvis du har tillid til dette script!

Svar

Prøv

exec ./script 

exec-kommandoen kører scriptet i den aktuelle shell uden at starte en ikke-interaktiv shell.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *