Определение переменной в 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
. Эта команда отмечает переменную для экспорта во все дочерние процессы, которые созданы внутри оболочки и делают ее переменной окружения.
Читайте также:
Как сохранять фокус на протяжении всего обучения: советы от Хекслета
Основное различие между этими двумя способами определения переменной заключается в том, что export
делает переменную доступной для всех следующих команд, которые выполняются в этой оболочке. Команда export
помечает MYVAR для автоматического экспорта в среду дочерних процессов, которые создаются такими командами:
Если переменная задана без использования export, то она будет доступна только внутри оболочки. Другими словами, дочерние оболочки, процесс или команды вне ее не получат доступа к ней:
Отличия переменных в Bash от переменных в других языках программирования заключаются в следующем:
- Переменные оболочки (определенные без экспорта) подобны локальным переменным. Доступ к ним можно получить только внутри этой оболочки.
- Переменные окружения (определенные с помощью экспорта) подобны глобальным переменным. Доступ к ним могут получить как в родительской оболочке, так и во всех дочерних оболочках, процессах и командах.
Однако между глобальными переменными в Bash и других языках программирования существует важное различие. Родительская оболочка может экспортировать свои переменные в среду дочерней оболочки, но дочерняя оболочка не может экспортировать переменные обратно в родительскую.
Когда стоит использовать export, а когда — нет
Переменные окружения следует использовать в случае, когда нужно экспортировать переменные и сделать их доступными для следующих команд и процессов. Обычно это происходит, когда среду нужно использовать вместе с дочерними процессами, например:
- При настройке среды дочернего процесса или оболочки
- При определении переменной, которую будет использовать сценарий bash, выполняемый из родительской оболочки
- При настройке переменных окружения для терминальных мультиплексоров (например, screen или tmux)
- При настройке среды сборки для сценариев и инструментов сборки
Переменные оболочки стоит использовать в случаях, когда они должны существовать только в родительской оболочке. Например, к ним относятся:
- Переменные счетчика циклов
- Временные переменные
Как использовать export
Подробнее рассмотрим команду export
и связанные с ней команды, которые часто используются с переменными окружения и оболочки.
Экспорт функции
export
может экспортировать не только переменные, но и функции. Для этого нужно использовать опцию командной строки export -f
. Стоит отметить, что функции будут доступны и в дочерних оболочках и процессах:
Удаление переменной
Переменные окружения автоматически экспортируются во все дочерние оболочки, а также в их дочерние оболочки. Для удаления автоматически унаследованной переменной существует команда export -n
:
Список всех экспортированных переменных
Для получения списка всех переменных и функций, экспортированных в текущую оболочку, используется команда export -p
:
Эта команда помогает проверить, что все переменные оболочки экспортированы правильно.
Автоматический экспорт всех переменных
Для автоматического экспорта всех переменных, определенных в текущей оболочке, существует опция all export
. Ее можно включать или отключать, используя команду set
:
Эту команду полезно включать перед вызовом сценария Bash, который определяет множество переменных без команды экспорта.
Как связаны родительская и дочерние оболочки
У передачи переменной окружения между родительской и дочерними оболочками существует определенная иерархия:
Сценарии и export
При создании сценария, вызываемого из командной оболочки и содержащего команду export
, нужно проверить соответствие результата экспорта ожидаемому. Для этого есть несколько способов.
Export во время выполнения скрипта
Выполнение сценария с командой export
из командной оболочки происходит в дочерней оболочке. Это означает, что любые переменные, экспортируемые сценарием, будут доступны только его дочерним оболочкам, но не родительской. Когда выполнение сценария завершится, экспортированные переменные исчезнут из среды:
Экспорт переменной в родительскую оболочку
Если при выполнении сценария необходимо экспортировать переменную окружения в родительскую оболочку, можно использовать команду source
. Она позволяет выполнить сценарий в текущей среде без создания дочерней оболочки.
Заключение
Команда export
помогает экспортировать переменные окружения так, чтобы они были доступны во всех дочерних процессах, оболочках и командах. Кроме того, различные параметры командной строки export
и других связанных команд предоставляют различные способы определения, экспорта и использования переменных в разных оболочках и сценариях.