Переменные среды окружения в Linux: различия между версиями

Материал из sysadm
Перейти к навигации Перейти к поиску
Строка 1: Строка 1:
 
'''Работа с переменными'''
 
'''Работа с переменными'''
 
<pre>
 
<pre>
# определение переменной (создание)
+
# определение внутренней переменной шела (создание)
my_var=some text
+
myvar=some text
 +
 
 +
# преобразование внутренней переменной шела в переменную среды окружения
 +
export <переменная> [= <значение>]
  
 
# отмена определения переменной (удаление)
 
# отмена определения переменной (удаление)
my_var=
+
unset myvar
  
 
# подстановка значения переменной
 
# подстановка значения переменной
 
echo $my_var
 
echo $my_var
 
echo ${my_var}
 
echo ${my_var}
 
# назначение переменной статуса экспортируемой в дочерние процессы
 
export <переменная> [= <значение>]
 
 
# по умолчанию, переменные родительского процесса не копируются в контекст дочернего процесса
 
# если переменная экспортирована, то при создании дочернего процесса в его контекст будет копироваться новая независимая копия этой переменной
 
 
</pre>
 
</pre>
  
'''При работе с переменными среды окружения важно понимать следующее:'''
+
'''При работе с переменными среды окружения важно понимать следующее (мое понимание, могу ошибаться):'''
  
# Переменные среды окружения не являются глобальными объектами операционной системы, каждый процесс имеет свой набор переменных. Изменение значения переменной в одном процессе не влечет за собой изменение значения в другом, даже если он является дочерним.
+
# внутренние переменные шела не являются переменными среды окружения
# При вызове дочернего процесса, операционная система копирует все переменные среды окружения родительского процесса в дочерний процесс
+
# внутренняя переменная шела преобразуется в переменную среды окружения командой export
# В процессе командного интерпретатора переменные среды окружения создаются командой export. Не экспортированные переменные не являются переменными среды окружения.
+
# у каждого процесса свой независимый набор переменных среды окружения, который хранится в контексте процесса
 +
# при создании дочернего процесса, системный вызов ядра ОС копирует в его контекст все переменные среды окружения родительского процесса (может зависеть от типа и параметров системного вызова)
  
 +
'''Разные способы запуска скрипта'''
 
<pre>
 
<pre>
# по умолчанию дочерние процессы не наследуют переменных родительского процесса
 
# чтобы установить наследование переменной дочерними процессами, ее необходимо экспортировать
 
export <переменная> [= <значение>]
 
 
 
# способы запуска скрипта, порождающие дочерний процесс шел
 
# способы запуска скрипта, порождающие дочерний процесс шел
 
# все определения переменных и функций в родительский процесс не передаются
 
# все определения переменных и функций в родительский процесс не передаются
 +
 +
# создается новый процесс шела, в его контекст копируются переменные среды окружения родительского процесса (экспортированные переменные)
 
./myscript.sh
 
./myscript.sh
 
/bin/bash myscript.sh
 
/bin/bash myscript.sh
  
# способы запуска скрипта текущим процессом шела
+
# запуск скрипта в контексте текущего шела, новый процесс шела не создается
# все определения переменных и функций сохраняются в текущем шеле
 
 
. myscript.sh
 
. myscript.sh
 
source myscript.sh
 
source myscript.sh
 
</pre>
 
</pre>

Версия 02:02, 17 октября 2025

Работа с переменными

# определение внутренней переменной шела (создание)
myvar=some text

# преобразование внутренней переменной шела в переменную среды окружения
export <переменная> [= <значение>]

# отмена определения переменной (удаление)
unset myvar

# подстановка значения переменной
echo $my_var
echo ${my_var}

При работе с переменными среды окружения важно понимать следующее (мое понимание, могу ошибаться):

  1. внутренние переменные шела не являются переменными среды окружения
  2. внутренняя переменная шела преобразуется в переменную среды окружения командой export
  3. у каждого процесса свой независимый набор переменных среды окружения, который хранится в контексте процесса
  4. при создании дочернего процесса, системный вызов ядра ОС копирует в его контекст все переменные среды окружения родительского процесса (может зависеть от типа и параметров системного вызова)

Разные способы запуска скрипта

# способы запуска скрипта, порождающие дочерний процесс шел
# все определения переменных и функций в родительский процесс не передаются

# создается новый процесс шела, в его контекст копируются переменные среды окружения родительского процесса (экспортированные переменные)
./myscript.sh
/bin/bash myscript.sh

# запуск скрипта в контексте текущего шела, новый процесс шела не создается
. myscript.sh
source myscript.sh