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

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

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

#!/bin/bash
FOO=bar

...или же

#!/bin/bash
export FOO=bar

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

7 ответов

Решение

Запустите ваш скрипт с .

. myscript.sh

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

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

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

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

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

. ./setfoo.sh

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

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

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

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

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

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

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

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

В противном случае позиционные параметры не изменяются. Статус возврата - это статус последней команды, вышедшей из скрипта (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

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

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

В вашем сценарии оболочки запишите переменные в другой файл, как показано ниже, и добавьте эти файлы в свой или

      echo "export FOO=bar" >> environment.sh

В вашей~/.bashrcили~/.zshrc, источник, как показано ниже:

      source Path-to-file/environment.sh

Затем вы можете получить к нему глобальный доступ.

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

      eval "$(yourscript)"

или, возможно, менее опасно

      cd "$(yourscript)"

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

FOO=bar
export FOO
Другие вопросы по тегам