it-swarm-eu.dev

Jak mohu nastavit proměnné prostředí na "exportované" ve skriptu Shell?

Mám několik účtů Amazon EC2 a chci rychle přepínat proměnné, například $EC2_HOME, pomocí skriptu.

Mám nastavený skript Shell 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 pomocí export by proměnná zůstala po dokončení skriptu. Ne, protože běží echo $EC_HOME nic nezobrazuje.

Vím, že to musí být velmi základní znalost skriptování Linuxu, ale já to nevím. Snažil jsem se hledat související otázky bez štěstí - takže se omlouvám, pokud se jedná o duplikát.

65
cwd

Měli byste zdroj skriptu pomocí

. ./script

nebo

source ./script
70
enzotib

Když spustíte skript, získá svůj vlastní Shell a své vlastní prostředí, které zmizí, jakmile je skript dokončen. Chcete-li udržet proměnné prostředí v okolí, vložte skript do aktuálního prostředí:

$ source ./a.sh

nebo ekvivalentně (ale trochu přenosněji) použijte příkaz POSIX dot :

$ . ./a.sh

Poté budou definice vloženy do vašeho současného prostředí Shell a budou zděděny všemi programy, které z něj spustíte.

Chcete-li být blíže ke spuštění skriptu, . a.sh najde a.sh prohledáním adresářů v proměnné prostředí PATH.


Existuje několik jemností v tom, jak se chovají, a zda . a source jsou stejné (nebo vůbec). . ./a.sh se bude určitě chovat stejně v každém prostředí kompatibilním s POSIX, ale source a ., a . a.sh a . ./a.sh, může se 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 podstatě podobný.

Pokud je název skriptu uveden jako cesta (obsahující /), tato cesta se používá přímo ve všech případech. Nejpřenosnější spolehlivá věc je . ./script nebo . /path/to/script.

38
Michael Homer

Jen 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)
1
toffee