Как сделать так, чтобы переменные среды «экспортировались» в скрипте оболочки?

54

У меня есть несколько учетных записей Amazon EC2 и я хочу быстро переключаться между переменными, например $EC2_HOME, с помощью сценария.

У меня есть сценарий оболочки, настроенный так:

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

Когда я запускаю скрипт, я знаю, что EC2_HOMEон установлен, но я подумал, что использование exportзаставит переменную остаться после завершения скрипта. Это не так, как работает, echo $EC_HOMEничего не показывает.

Я знаю, что это должно быть очень элементарное знание сценариев Linux, но я этого не знаю. Я безуспешно пытался найти похожие вопросы - так что извиняюсь, если это дубликат.

УХО
источник

Ответы:

60

Вы должны поставить свой сценарий, с

. ./script

или же

source ./script
enzotib
источник
19
причина в том, что ваш скрипт порождает новый процесс оболочки как дочерний элемент текущей оболочки. Любые изменения среды, которые вы делаете в дочернем процессе, не могут повлиять на родительский процесс . Когда вы используете .или source, вы не порождаете новый дочерний процесс, вы запускаете команды в текущей оболочке.
Гленн Джекман
1
@glennjackman У меня похожая проблема, и я попробовал ваше решение, но оно выводит меня из оболочки, когда я делаю .или source. Почему это происходит ?
Патрик
7
@Patryk: возможно, в вашем сценарии есть exitутверждение, поэтому он не подходит для поиска.
энзотиб
Пока source ./scriptработает совершенно нормально, sudo source ./script.shговорит sudo: source: command not found. Как я могу сделать это с помощью sudo?
71GA,
1
@ 71GA: в зависимости от предпочтений компиляции sudoи от настроек конфигурации /etc/sudoersвы можете или не можете сохранить свою среду при выполнении команд с sudo. Я предлагаю вам попытаться получить исходный текст вашего сценария, а затем запустить его sudoс -Eопцией сохранения среды. Если это не сработает, я полагаю, вы можете сделать очень мало.
энзотиб,
36

Когда вы запускаете скрипт, он получает собственную оболочку и собственную среду, которые снова исчезают, как только скрипт завершается. Чтобы сохранить переменные окружения, поставьте скрипт в вашу текущую оболочку:

$ source ./a.sh

или эквивалентно (но немного более переносимо) используйте команду точки POSIX :

$ . ./a.sh

Затем определения будут помещены в среду вашей текущей оболочки и будут наследоваться всеми программами, которые вы запускаете из нее.

Чтобы быть ближе к запуску скрипта, . a.shнайдите a.sh путем поиска в каталогах в PATHпеременной окружения.


Есть некоторые тонкости в том, как они ведут себя, .и sourceявляются ли они одинаковыми (или присутствуют вообще). . ./a.shопределенно будет вести себя одинаково в каждой POSIX-совместимой оболочке, но sourceи ., и, . a.shи . ./a.sh, могут отличаться. Для Баш sourceи .одинаковы во всех случаях; для Zsh sourceвсегда проверяет текущий каталог первой ; Кш по сути похож.

Если имя сценария задано в виде пути (содержащего a /), этот путь используется непосредственно во всех случаях. Наиболее переносимая надежная вещь - это . ./scriptили . /path/to/script.

Майкл Гомер
источник
1

Просто для записи.

Если вы хотите запустить скрипт из интернета, который экспортирует env в систему

Вы можете использовать следующий формат

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Например:

source <(curl -s -L https://example.com/install.sh)
ириска
источник
Выглядит опасно, но полезно, если вы доверяете этому сценарию!
Марк Стюарт