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

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

Текущая версия на 02:49, 17 октября 2025

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

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

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

# вывод списка переменных среды окружения (экспортированных переменных)
export -p

# изменение значения переменной среды окружения (экспортированной переменной) не преобразует ее обратно во внутреннюю переменную
export myvar
myvar=some text

# отмена определения переменной
# применимо к внутренним переменным и переменным среды окружения (экспортированным переменным)
unset myvar

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

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

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

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

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

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