Вы объединяете две разные вещи: среду выполнения и переменные среды .
Переменные среды - это строки формы name = value
, которые используются как форма конфигурации для команд и процессов. Например, PATH
- это список каталогов, разделенных двоеточиями, в которых ищутся исполняемые команды, когда предоставляется только имя файла команды; LANG
и различные переменные, начинающиеся с LC_
, управляют локалью и так далее.
Среда выполнения включает в себя все функции оболочки, которые влияют на выполнение команд. Конечно, он включает в себя переменные среды, но также такие вещи, как рабочий каталог, маску создания файла ( umask
), функции оболочки и определенные псевдонимы и так далее.
В момент выполнения - в момент, когда оболочка начинает выполнение команды - среда выполнения почти одинакова во всех случаях, с exec
или без него. С помощью exec
срабатывает ловушка оболочки EXIT
(поскольку оболочка по существу завершается, когда заменяется другим процессом). Команда exec -c
очищает переменные среды.
Флаг -c
в Bash exec
очищает только переменные среды. Если вы запускаете
bash -c `exec env`
, вы запускаете новую оболочку Bash, которая затем заменяется командой env
; который, когда не указаны другие параметры, просто выводит все переменные среды.Однако, если вы добавите флаг -c
к exec
, то есть
bash -c `exec -c env`
он ничего не печатает, и это потому, что env
запускается без переменных среды ( или, другими словами, пустое окружение).
(Если вы запустите в терминале только exec env
, оболочка, работающая в терминале, будет заменена командой env
, и когда она завершится, терминал закроется. Вероятно, это произойдет слишком быстро, чтобы вы могли это увидеть. Вот почему я явно запускаю его под Bash, так как в этом случае заменяется именно этот sub-Bash, а не оболочка, которую использует ваш терминал.)
У меня есть не видел параметр -c
, используемый в реальных сценариях, поскольку обычно вместо него используется env -i
. Например:
bash -c `exec env -i PATH=$PATH env`
С параметрами команда env
используется для запуска команды с измененными переменными среды; параметр -i
используется для запуска с нуля; т.е. очистить все существующие переменные среды. Поскольку оболочка анализирует всю команду (строку) перед ее выполнением, вы можете использовать env -i VAR = $ VAR OTHER = $ OTHER
, чтобы сохранить определенные переменные среды, указав env
чтобы определить их со старыми значениями, которые у них были, когда оболочка анализировала командную строку. В приведенном выше примере последний env
просто распечатывает результирующие переменные среды, но это может быть любая другая команда.