Глобальные переменные среды в сценарии оболочки
Как установить глобальную переменную среды в скрипте 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)"
Это распространяется на инструменты на других языках, помимо сценария оболочки.