it-swarm.com.ru

Глобальные переменные среды в сценарии оболочки

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

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

#!/bin/bash
FOO=bar

...или же

#!/bin/bash
export FOO=bar

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

77
Alex

Запустите ваш скрипт с помощью .

. myscript.sh

Это запустит скрипт в текущей среде Shell.

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

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

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

132
mob

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

. ./setfoo.sh

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

Со страницы руководства bash:

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

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

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

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

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

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

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

50
paxdiablo

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
8
CDT
#!/bin/bash
export FOO=bar

или же

#!/bin/bash
FOO=bar
export FOO

человек экспорт:

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

4
Andrejs Cainikovs