В чем разница между env, setenv, export и когда использовать?

18

Недавно я заметил, что у нас есть 3 варианта установки переменных среды:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Если есть другие способы, пожалуйста, просветите нас.

Когда я должен предпочесть одно другому? Пожалуйста, предложите рекомендации.

Что касается совместимости с оболочкой, которая является самой обширной (охватывает больше диалектов оболочки)?

Я уже заметил этот ответ, но я хотел бы расширить вопрос с помощью envи предпочтений использования.

Maroshi
источник

Ответы:

14

export VARIABLE_NAME='some value'это способ установить переменную среды в любой POSIX-совместимой оболочке ( sh, dash, bash, ksh, и т.д .; также ЗШ). Если переменная уже имеет значение, вы можете использовать ее, export VARIABLE_NAMEчтобы сделать ее переменной среды без изменения ее значения.

Оболочки Bourne до POSIX не поддерживали это, поэтому вы увидите сценарии, которые избегают export VARIABLE_NAME='some value'и используют VARIABLE_NAME='some value'; export VARIABLE_NAMEвместо этого. Но снаряды до POSIX Борна в наше время чрезвычайно редки.

setenv VARIABLE_NAME='some value'синтаксис csh для установки переменной окружения setenvне существует в sh, а csh крайне редко используется в сценариях и превосходит bash для интерактивного использования в течение последних 20 лет (и zsh еще дольше), поэтому вы можете забыть об этом, если не столкнетесь с ним.

Команда envочень редко полезна, за исключением строк Шебанга . Когда вызывается без аргументов, он отображает среду, но exportделает это лучше (сортируется и часто заключается в кавычки для устранения неоднозначности строк в значениях и строк, которые разделяют значения). Когда вызывается с аргументами, он запускает команду с дополнительными переменными окружения, но та же команда без нее envтакже работает ( VAR=value mycommandзапускается mycommandс VARустановленным значением value, как и env VAR=value mycommand). Причиной envполезности строки shebang является то, что она выполняет PATHпоиск, и при вызове с именем команды не происходит ничего другого. Команда envможет быть полезна для запуска команды только с несколькими переменными среды с-iили без параметров для отображения среды, включая переменные с недопустимыми именами, которые оболочка не импортирует.

Жиль "ТАК - прекрати быть злым"
источник
3

Установка переменной вроде VAR='asdf'оставляет среду неизменной, а это означает, что программы, которые вы запускаете в одном сеансе, ничего не будут знать VARи не смогут получить к ней доступ. Вы хотите такое поведение при написании сценариев оболочки.

exportс другой стороны, это встроенная утилита bash, которая модифицирует среду, делая экспортированную переменную видимой для дочерних процессов, порожденных в текущем сеансе. Вы можете достичь того же, запустив VAR='asdf' %program_name%.

envэто не встроенная программа, а сама программа. На поверхности это работает так же, как когда выVAR='asdf' %program_name% , но на нижнем уровне все становится немного сложнее. Во- первых, envполучает запущен. Он изменяет среду, затем выполняет команду с заданными аргументами. Такое же поведение вы можете реализовать в своем собственном коде с помощью системного вызова exec (3) .

setenvкак раз exportв оболочках семейства csh, как указано в вашем ответе.

user230253
источник
2
В современных оболочках, VAR=asdfдействительно ли обновляется окружение, если оно VARуже было в окружении. (Это не было правдой в оригинальной оболочке Bourne.)
Жиль "ТАК - перестань быть злым"
2

Есть несколько вопросов с ответами, которые отвечают на это:

(и т.д.)

Кусалананда
источник