- Global environment variables in a shell script
- 7 Answers 7
- How to Set an Environment Variable in Linux
- What Are Environment Variables?
- How to List Environment Variables in Linux
- Conclusion
- Определение переменной в Bash: с командой export и без
- Определение переменной с export и без
- Когда стоит использовать export, а когда — нет
- Как использовать export
- Экспорт функции
- Удаление переменной
- Список всех экспортированных переменных
- Автоматический экспорт всех переменных
- Как связаны родительская и дочерние оболочки
- Сценарии и export
- Export во время выполнения скрипта
- Экспорт переменной в родительскую оболочку
- Заключение
Global environment variables in a shell script
. the vars seem to stay in the local context, whereas I’d like to keep using them after the script has finished executing.
7 Answers 7
This will run the script in the current shell environment.
export governs which variables will be available to new processes, so if you say
FOO=1 export BAR=2 ./runScript.sh
then $BAR will be available in the environment of runScript.sh , but $FOO will not.
Be careful with that first one. Without a slash, it will look in your path: use something like ‘. ./myscript.sh’ if you want to ensure it runs a specific one.
source is an alias for . . So you could run source myscript.sh instead, if you wanted to be more explicit.
@cNgamba Ask a new question if you can’t find it by reading the other answers on this page and/or googling, but this is a common FAQ; see also e.g. unix.stackexchange.com/questions/114300/…
When you run a shell script, it’s done in a sub-shell so it cannot affect the parent shell’s environment. You want to source the script by doing:
This executes it in the context of the current shell, not as a sub shell.
. filename [arguments]
source filename [arguments]Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.
If filename does not contain a slash, file names in PATH are used to find the directory containing filename.
The file searched for in PATH need not be executable. When bash is not in POSIX mode, the current directory is searched if no file is found in PATH.
If the sourcepath option to the shopt builtin command is turned off, the PATH is not searched.
If any arguments are supplied, they become the positional parameters when filename is executed.
Otherwise the positional parameters are unchanged. The return status is the status of the last command exited within the script (0 if no commands are executed), and false if filename is not found or cannot be read.
How to Set an Environment Variable in Linux
Zaira Hira
In programming, you use variables to store information like strings and numbers temporarily.
Variables can be used repeatedly throughout the code or by your operating system to provide values. You can edit them, overwrite them, and delete them.
In this tutorial, I’ll teach you what environment variables are and how to set them in Linux.
What Are Environment Variables?
Environment variables are the variables specific to a certain environment. For example, each user in an operating system has its own environment. An admin user has a different environment than other users do, for example.
You might declare an environment variable only required by your user (for example a secret token) that doesn’t need to be exposed to other users.
Here are some examples of environment variables in Linux:
- USER – This points to the currently logged-in user.
- HOME – This shows the home directory of the current user.
- SHELL – This stores the path of the current user’s shell, such as bash or zsh.
- LANG – This variable points to the current language/locales settings.
- MAIL – This shows the location of where the current user’s mail is stored.
These environment variables vary based on the current user session.
How to List Environment Variables in Linux
The command used to display all the environment variables defined for a current session is env .
Here is the output for my session:
For the changes to take effect, update the .bashrc file using the source command:
Let’s verify by opening a new session.
For the changes to take effect, use the command source /etc/environment .
- /etc/profile – Variables set in this file are read whenever a bash shell is logged in. Edit this file and use the export command:
Now, I’ll switch the user to the root user and verify if I can access the variable GLOBAL_VARIABLE .
root@Zaira:~# echo $GLOBAL_VARIABLE This is a global variable
It worked! I have been able to access the global variable defined by the user Zaira through the root user as well. The same would apply to other users too. So now you also know how to define global environment variables.
Conclusion
In this tutorial, you learned how to create and define environment variables in Linux. You also learned how to make them persistent so that you can use them across multiple sessions.
What’s your favorite thing you learned here? Let me know on Twitter!
You can read my other posts here.
Определение переменной в Bash: с командой export и без
Bash-переменные Linux предполагают два способа определения переменной оболочки — с командой export и без нее. Это важный момент — добавление этой команды меняет область действия переменной. В этой статье разберем различия между определением переменной оболочки с export и без, а также рассмотрим варианты использования export и его параметры.
Это адаптированный перевод статьи Defining a Bash Variable With or Without ‘export’ из блога образовательного проекта Baeldung.
С одной стороны, Bash — самый популярный командный интерпретатор в юниксоподобных системах, особенно в GNU/Linux. С другой — скриптовый язык программирования со своим синтаксисом и особенностями.
Определение переменной с export и без
Переменные Bash похожи на переменные в Java или C++, но с одним существенным отличием: они не нуждаются в объявлении. Переменную создает присвоение ее имени значения. Например, так:
$ MYVAR=1729 $ export MYVAR=1729
В первом случае создается переменная оболочки с именем MYVAR, которой присваивается значение 1729. Во втором определение переменной происходит точно также, но с помощью export . Эта команда отмечает переменную для экспорта во все дочерние процессы, которые созданы внутри оболочки и делают ее переменной окружения.
Читайте также: Как сохранять фокус на протяжении всего обучения: советы от Хекслета
Основное различие между этими двумя способами определения переменной заключается в том, что export делает переменную доступной для всех следующих команд, которые выполняются в этой оболочке. Команда export помечает MYVAR для автоматического экспорта в среду дочерних процессов, которые создаются такими командами:
$ export MYVAR=1729 $ echo $MYVAR 1729 $ bash # Open a new child shell $ echo $MYVAR 1729
Если переменная задана без использования export, то она будет доступна только внутри оболочки. Другими словами, дочерние оболочки, процесс или команды вне ее не получат доступа к ней:
$ MYVAR=1729 $ echo $MYVAR 1729 $ bash # Open a new child shell $ echo $MYVAR $
Отличия переменных в Bash от переменных в других языках программирования заключаются в следующем:
- Переменные оболочки (определенные без экспорта) подобны локальным переменным. Доступ к ним можно получить только внутри этой оболочки.
- Переменные окружения (определенные с помощью экспорта) подобны глобальным переменным. Доступ к ним могут получить как в родительской оболочке, так и во всех дочерних оболочках, процессах и командах.
Однако между глобальными переменными в Bash и других языках программирования существует важное различие. Родительская оболочка может экспортировать свои переменные в среду дочерней оболочки, но дочерняя оболочка не может экспортировать переменные обратно в родительскую.
Когда стоит использовать export, а когда — нет
Переменные окружения следует использовать в случае, когда нужно экспортировать переменные и сделать их доступными для следующих команд и процессов. Обычно это происходит, когда среду нужно использовать вместе с дочерними процессами, например:
- При настройке среды дочернего процесса или оболочки
- При определении переменной, которую будет использовать сценарий bash, выполняемый из родительской оболочки
- При настройке переменных окружения для терминальных мультиплексоров (например, screen или tmux)
- При настройке среды сборки для сценариев и инструментов сборки
Переменные оболочки стоит использовать в случаях, когда они должны существовать только в родительской оболочке. Например, к ним относятся:
Как использовать export
Подробнее рассмотрим команду export и связанные с ней команды, которые часто используются с переменными окружения и оболочки.
Экспорт функции
export может экспортировать не только переменные, но и функции. Для этого нужно использовать опцию командной строки export -f . Стоит отметить, что функции будут доступны и в дочерних оболочках и процессах:
$ func() > echo hi > > $ func hi $ bash # Open a new child shell $ func bash: func: command not found $ exit # Back to parent shell $ export -f func $ bash # Open a new child shell $ func hi
Удаление переменной
Переменные окружения автоматически экспортируются во все дочерние оболочки, а также в их дочерние оболочки. Для удаления автоматически унаследованной переменной существует команда export -n :
$ echo $USER ubuntu $ bash # Open a new child shell $ echo $USER ubuntu $ exit # Back to parent shell $ export -n USER $ bash # Open a new child shell again $ echo $USER $
Список всех экспортированных переменных
Для получения списка всех переменных и функций, экспортированных в текущую оболочку, используется команда export -p :
$ export -p declare -x COLORTERM="truecolor" declare -x DESKTOP_SESSION="ubuntu" declare -x DISPLAY=":0" declare -x GDMSESSION="ubuntu" declare -x LESSCHARSET="latin1" declare -x LESSCLOSE="/usr/bin/lesspipe %s %s" declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s 2>&-" . . declare -x XDG_SESSION_DESKTOP="ubuntu" declare -x XDG_SESSION_ID="2" declare -x XDG_SESSION_TYPE="x11" declare -x XDG_VTNR="1"
Эта команда помогает проверить, что все переменные оболочки экспортированы правильно.
Автоматический экспорт всех переменных
Для автоматического экспорта всех переменных, определенных в текущей оболочке, существует опция all export . Ее можно включать или отключать, используя команду set :
$ set -a # Enable allexport using single letter syntax $ set -o allexport # Enable using full option name syntax
$ set +a # Disable allexport using single letter syntax $ set +o allexport # Disable using full option name syntax
$ set -a $ MYVAR=1729 # no export $ bash # Open a new child shell $ echo $MYVAR 1729
Эту команду полезно включать перед вызовом сценария Bash, который определяет множество переменных без команды экспорта.
Как связаны родительская и дочерние оболочки
У передачи переменной окружения между родительской и дочерними оболочками существует определенная иерархия:
Сценарии и export
При создании сценария, вызываемого из командной оболочки и содержащего команду export , нужно проверить соответствие результата экспорта ожидаемому. Для этого есть несколько способов.
Export во время выполнения скрипта
Выполнение сценария с командой export из командной оболочки происходит в дочерней оболочке. Это означает, что любые переменные, экспортируемые сценарием, будут доступны только его дочерним оболочкам, но не родительской. Когда выполнение сценария завершится, экспортированные переменные исчезнут из среды:
$ echo "export MYVAR=1729" > myscript.sh $ chmod +x myscript.sh $ ./myscript.sh $ echo $MYVAR $
Экспорт переменной в родительскую оболочку
Если при выполнении сценария необходимо экспортировать переменную окружения в родительскую оболочку, можно использовать команду source . Она позволяет выполнить сценарий в текущей среде без создания дочерней оболочки.
$ echo "MYVAR=1729" > myscript.sh $ source myscript.sh $ echo $MYVAR 1729
Заключение
Команда export помогает экспортировать переменные окружения так, чтобы они были доступны во всех дочерних процессах, оболочках и командах. Кроме того, различные параметры командной строки export и других связанных команд предоставляют различные способы определения, экспорта и использования переменных в разных оболочках и сценариях.
Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях