Глобальные переменные окружения в оболочке script

Как установить глобальную переменную окружения в bash script?

Если я делаю что-то вроде

#!/bin/bash
FOO=bar

... или

#!/bin/bash
export FOO=bar

... vars, кажется, остаются в локальном контексте, тогда как я хотел бы продолжать использовать их после завершения выполнения script.

Ответ 1

Запустите script с помощью .

. myscript.sh

Это приведет к запуску script в текущей среде оболочки.

export определяет, какие переменные будут доступны для новых процессов, поэтому, если вы скажете

FOO=1
export BAR=2
./runScript.sh

тогда $BAR будет доступен в среде runScript.sh, но $FOO не будет.

Ответ 2

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

. ./setfoo.sh

Выполняет его в контексте текущей оболочки, а не как подклассу.

На странице bash man:

. filename [аргументы]
исходное имя файла [аргументы]

Чтение и выполнение команд из имени файла в текущей оболочке окружающей среды и вернуть статус выхода последней выполненной команды от имени файла.

Если имя файла не содержит косой черты, имена файлов в PATH используются для найдите каталог, содержащий имя файла.

Поиск файла в PATH не обязательно должен выполняться. Когда bash не в режиме POSIX выполняется поиск текущего каталога, если файл не найден в PATH.

Если опция sourcepath для встроенной команды магазина отключена, PATH не выполняется.

Если имеются какие-либо аргументы, они становятся позиционными параметрами при выполнении имени файла.

В противном случае позиционные параметры не изменяются. Статус возврата - это статус последней команды, выходящей из script (0, если нет команды выполняются), а false, если имя файла не найдено или не может читайте.

Ответ 3

source myscript.sh также возможно.

Описание для команды linux source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

Ответ 4

#!/bin/bash
export FOO=bar

или

#!/bin/bash
FOO=bar
export FOO

man export:

Оболочка должна предоставить атрибут экспорта переменным, соответствующим указанным именам, что приведет к тому, что они будут находиться в среде последующих команд. Если за именем переменной следует слово = слово, то значение этой переменной должно быть установлено на слово.

Ответ 5

FOO=bar
export FOO