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 . nebo source, 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 . nebo source. 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é spustit sudo 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í.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *