- How to Set Environment Variables in Linux
- Setting an Environment Variable
- Unsetting an Environment Variable
- Listing All Set Environment Variables
- Persisting Environment Variables for a User
- Export Environment Variable
- Setting Permanent Global Environment Variables for All Users
- Conclusion
- Определение переменной в Bash: с командой export и без
- Определение переменной с export и без
- Когда стоит использовать export, а когда — нет
- Как использовать export
- Экспорт функции
- Удаление переменной
- Список всех экспортированных переменных
- Автоматический экспорт всех переменных
- Как связаны родительская и дочерние оболочки
- Сценарии и export
- Export во время выполнения скрипта
- Экспорт переменной в родительскую оболочку
- Заключение
How to Set Environment Variables in Linux
In this tutorial, you will learn how to set environment variables in Ubuntu, CentOS, Red Hat, basically any Linux distribution for a single user and globally for all users. You will also learn how to list all environment variables and how to unset (clear) existing environment variables.
Environment variables are commonly used within the Bash shell. It is also a common means of configuring services and handling web application secrets.
It is not uncommon for environment specific information, such as endpoints and passwords, for example, to be stored as environment variables on a server. They are also used to set the important directory locations for many popular packages, such as JAVA_HOME for Java.
Setting an Environment Variable
To set an environment variable the export command is used. We give the variable a name, which is what is used to access it in shell scripts and configurations and then a value to hold whatever data is needed in the variable.
For example, to set the environment variable for the home directory of a manual OpenJDK 11 installation, we would use something similar to the following.
export JAVA_HOME=/opt/openjdk11
To output the value of the environment variable from the shell, we use the echo command and prepend the variable’s name with a dollar ($) sign.
And so long as the variable has a value it will be echoed out. If no value is set then an empty line will be displayed instead.
Unsetting an Environment Variable
To unset an environment variable, which removes its existence all together, we use the unset command. Simply replace the environment variable with an empty string will not remove it, and in most cases will likely cause problems with scripts or application expecting a valid value.
To following syntax is used to unset an environment variable
For example, to unset the JAVA_HOME environment variable, we would use the following command.
Listing All Set Environment Variables
To list all environment variables, we simply use the set command without any arguments.
An example of the output would look something similar to the following, which has been truncated for brevity.
BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=([0]="0") BASH_ARGV=() BASH_CMDS=() BASH_COMPLETION_VERSINFO=([0]="2" [1]="8") BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="5" [1]="0" [2]="3" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='5.0.3(1)-release' COLUMNS=208 DIRSTACK=() EUID=1000 GROUPS=() HISTCONTROL=ignoreboth HISTFILE=/home/ubuntu/.bash_history HISTFILESIZE=2000 HISTSIZE=1000 HOME=/home/ubuntu HOSTNAME=ubuntu1904 HOSTTYPE=x86_64 IFS=$' \t\n' LANG=en_US.UTF-8 LESSCLOSE='/usr/bin/lesspipe %s %s' LESSOPEN='| /usr/bin/lesspipe %s' LINES=54
Persisting Environment Variables for a User
When an environment variable is set from the shell using the export command, its existence ends when the user’s sessions ends. This is problematic when we need the variable to persist across sessions.
To make an environment persistent for a user’s environment, we export the variable from the user’s profile script.
- Open the current user’s profile into a text editor
export JAVA_HOME=/opt/openjdk11
Adding the environment variable to a user’s bash profile alone will not export it automatically. However, the variable will be exported the next time the user logs in.
To immediately apply all changes to bash_profile, use the source command.
Export Environment Variable
Export is a built-in shell command for Bash that is used to export an environment variable to allow new child processes to inherit it.
To export a environment variable you run the export command while setting the variable.
export MYVAR="my variable value"
We can view a complete list of exported environment variables by running the export command without any arguments.
SHELL=/bin/zsh SHLVL=1 SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.1pB5Pry8Id/Listeners TERM=xterm-256color TERM_PROGRAM=vscode TERM_PROGRAM_VERSION=1.48.2
To view all exported variables in the current shell you use the -p flag with export.
Setting Permanent Global Environment Variables for All Users
A permanent environment variable that persists after a reboot can be created by adding it to the default profile. This profile is loaded by all users on the system, including service accounts.
All global profile settings are stored under /etc/profile. And while this file can be edited directory, it is actually recommended to store global environment variables in a directory named /etc/profile.d, where you will find a list of files that are used to set environment variables for the entire system.
- Create a new file under /etc/profile.d to store the global environment variable(s). The name of the should be contextual so others may understand its purpose. For demonstrations, we will create a permanent environment variable for HTTP_PROXY.
sudo touch /etc/profile.d/http_proxy.sh
sudo vi /etc/profile.d/http_proxy.sh
export HTTP_PROXY=http://my.proxy:8080
export HTTPS_PROXY=https://my.proxy:8080
export NO_PROXY=localhost. 1,.example.com
Conclusion
This tutorial covered how to set and unset environment variables for all Linux distributions, from Debian to Red Hat. You also learned how to set environment variables for a single user, as well as all users.
Определение переменной в 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 и других связанных команд предоставляют различные способы определения, экспорта и использования переменных в разных оболочках и сценариях.
Никогда не останавливайтесь: В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях