Главная | Все статьи | Код

Определение переменной в Bash: с командой export и без

Время чтения статьи ~6 минут
Определение переменной в Bash: с командой export и без главное изображение

Bash-переменные Linux предполагают два способа определения переменной оболочки — с командой export и без нее. Это важный момент — добавление этой команды меняет область действия переменной. В этой статье разберем различия между определением переменной оболочки с export и без, а также рассмотрим варианты использования export и его параметры.

Это адаптированный перевод статьи Defining a Bash Variable With or Without ‘export’ из блога образовательного проекта Baeldung.

С одной стороны, Bash — самый популярный командный интерпретатор в юниксоподобных системах, особенно в GNU/Linux. С другой — скриптовый язык программирования со своим синтаксисом и особенностями.

Бесплатные курсы по программированию в Хекслете
  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки
Выбрать курс

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

Бесплатные курсы по программированию в Хекслете
  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки
Выбрать курс

Аватар пользователя Oleg Sabitov
Oleg Sabitov 06 мая 2022
47
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 25 апреля
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 25 апреля
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время