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
.
ellersource
, 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
.
ellersource
. 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
sigersudo: 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 medsudo
. Jeg foreslår, at du prøver at kilde dit script og derefter kørersudo
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.