Mám několik účtů Amazon EC2 a chci rychle přepínat proměnné, například $EC2_HOME
pomocí skript.
Mám nastavený shell skript takto:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
Když spustím skript, vím, že EC2_HOME
je nastaven, ale myslel jsem si, že použití export
způsobí, že proměnná zůstane po dokončení skriptu. Ne, protože běh echo $EC_HOME
nic neukazuje.
Vím, že to musí být velmi základní znalosti skriptování v Linuxu, ale nevím to. I bez štěstí jsem zkusil hledat související otázky – takže se omlouvám, pokud se jedná o duplikát.
Odpověď
Měli byste zadat svůj skript, pomocí
. ./script
nebo
source ./script
komentářů
- důvodem je, že váš skript vytvoří nový proces prostředí jako podřízený aktuální prostředí. Jakékoli změny prostředí, které v podřízeném procesu provedete, nemohou ovlivnit rodiče. Když použijete
.
nebosource
, nevytváříte nový podřízený proces, spouštíte příkazy v aktuálním prostředí. - @glennjackman Mám podobný problém a vyzkoušel jsem vaše řešení, ale odhlásí mě ze shellu, když udělám
.
nebosource
. Proč je to tak pening? - @Patryk: možná má váš skript prohlášení
exit
, takže není vhodné ho získávat. - While
source ./script
funguje úplně dobře,sudo source ./script.sh
říkásudo: source: command not found
. Jak to mohu udělat pomocí sudo? - @ 71GA: v závislosti na předvolbách kompilace pro
sudo
a v závislosti na nastavení konfigurace v/etc/sudoers
můžete nebo nemůžete chránit své prostředí při spouštění příkazů pomocísudo
. Doporučuji zkusit zdrojový skript a poté spustitsudo
s možností-E
pro zachování prostředí. Pokud to nefunguje, předpokládám, že toho můžete udělat jen velmi málo.
Odpovědět
Když spustíte skript získá svůj vlastní shell a vlastní prostředí, které po dokončení skriptu opět zmizí. Chcete-li zachovat proměnné prostředí, vložte skript do svého aktuálního shellu:
$ source ./a.sh
nebo ekvivalentně (ale trochu lépe) použijte POSIX dot příkaz :
$ . ./a.sh
Poté budou definice vloženy do prostředí vašeho aktuálního prostředí a budou zděděny libovolnými programy, které z něj spustíte.
Chcete-li být blíže spuštění skriptu, . a.sh
najde a.sh prohledáním adresářů v PATH
proměnná prostředí.
Jak se tyto funkce chovají, a zda .
a source
jsou stejné (nebo se vůbec vyskytují). . ./a.sh
se bude určitě chovat stejně v každém POSIX kompatibilním prostředí, ale source
a .
a . a.sh
a . ./a.sh
se mohou lišit . Pro Bash source
a .
jsou stejné ve všech případech; pro zsh source
vždy nejprve zkontroluje aktuální adresář ; ksh je v zásadě podobný.
Pokud je název skriptu uveden jako cesta (obsahující /
), použije se tato cesta přímo ve všech případech. Nejpřenositelnější spolehlivostí je . ./script
nebo . /path/to/script
.
odpověď
Pouze pro záznam.
Pokud chcete spustit skript z internetu, který exportuje env do systému
, můžete použít následující formát
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
Například:
source <(curl -s -L https://example.com/install.sh)
Komentáře
- Vypadá to nebezpečně, ale užitečné, pokud tomuto skriptu důvěřujete!
Odpovědět
Zkuste
exec ./script
Příkaz exec spustí skript v aktuálním prostředí bez spuštění neinteraktivního prostředí.