Глобальные переменные в shell-скрипт


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

Если я делаю такие вещи, как

#!/bin/bash
FOO=bar

...или

#!/bin/bash
export FOO=bar

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

5 77

5 ответов:

запустите скрипт с помощью .

. myscript.sh

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

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

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

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

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

. ./setfoo.sh

это выполняет его в контексте настоящее Шелл, а не как sub оболочки.

с главной страницы bash:

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

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

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

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

Если параметр sourcepath для команды shopt builtin отключен, путь не ищется.

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

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

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

или

#!/bin/bash
FOO=bar
export FOO

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

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

FOO=bar
export FOO