Снимите значение переменной окружения для одной команды

Снимите значение переменной окружения для одной команды

20.09.2013 03:04:49 Просмотров 36 Источник

В Bash мы можем задать переменную окружения для одной команды таким образом:

FOO=bar somecommand

Что делать, если мы хотим снять значение переменной для одной команды?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command#comment41477603_18906350
Связанные не только одной командой: stackoverflow.com/questions/6877727/…

Ответы - Снимите значение переменной окружения для одной команды / Unset an environment variable for a single command

Является ответом!
JB.

20.09.2013 03:08:08

Технически, они не являются переменными окружения, пока ктоexportих. Но вы можете по крайней мере установить их пустыми:

FOO= some command

Если удаление их из окружающей среды достаточно, вы можете использовать env:

env -u FOO somecommand
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment27910030_18906391
Вы можете также использовать подоболочку: (unset FOO; some command). Но в любом случае, я считаю, что пустые переменные окружения отличаются от отсутствующих переменных окружения, поэтому я не буду использовать FOO= some command.
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment27910136_18906391
(И я тоже). (Охай ККИ, сколько же времени прошло!)
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment27910270_18906391
Технически они являются переменными окружения, только не для текущей среды: переменные добавляются в среду выполняемой команды и не влияют на текущую среду оболочки
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment27910355_18906391
@glennjackman нет, JB говорит, что запуск FOO=barсам по себе не устанавливает переменную окружения, если FOOне экспортируется.
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment27910511_18906391
Я только что снова взглянул на bash doc, и он действительно использует термин environment для локальных переменных оболочки. Но для неэкспортированных я бы счел это действительно деталью реализации. Я не собираюсь проверять, звонит ли он setenvтолько сегодня вечером.
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment27910900_18906391
@JB: он также не вызывает setenv для экспортируемых переменных, но добавляет их в список переменных среды, передаваемых дочерним процессам. Поскольку bash на самом деле не различает переменные окружения и другие типы переменных, результат exportне особенно виден в оболочке, в которой он был выполнен. (Конечно, вы можете увидеть разницу с declare -p.) Независимо от того, как вы относитесь к пустым и отсутствующим переменным, bash на самом деле не различает их, если вы set -u-и если вы это сделаете, многие стандартные скрипты сломаются.
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment27935207_18906391
Установка переменной пустым сработала для моей цели (хотя я и не ожидал этого). Спасибо!
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment47874135_18906391
@rici, в качестве commandможет быть make, который различает, какие переменные окружения не заданы, а какие просто пусты.
https://stackoverflow.com/questions/18906350/unset-an-environment-variable-for-a-single-command/18906391#comment47874158_18906391
@JB., для этой конкретной команды FOOбудет установлен в качестве переменной окружения
qwertzguy

19.01.2017 10:01:31

env -u FOO somecommand

Это приведет к удалению переменной среды FOOиз somecommand

VonC

03.02.2020 08:20:54

Это сложно, когда "somecommand" является функцией оболочки .

Однократные назначения переменных окружения, такие как ' FOO' в " FOO=bar cmd", существуют только во время вызова 'cmd'.
Однако если " cmd"оказывается функцией оболочки, то" FOO" назначается в самой исполняющей оболочке, и это назначение остается до завершения процесса (если явно не отменено).
Поскольку этот побочный эффект "value" вряд ли будет преднамеренным, его следует избегать.

Чтобы дополнительно проиллюстрировать, насколько опасна команда FOO= aCommand, рассмотрим Git 2.26 (Q1 2020), который избегает "FOO= shell_function(unsetting FOOтолько для одной команды).

Увидеть совершают d6509da, совершить a7fbf12, совершить c7973f2 (26 декабря 2019) с Джонатан Нидер (artagnon).
(Объединено Junio C Hamano -- gitster-- в commit c7372c9, 30 Jan 2020)

fetch test: избегайте использования "VAR= cmd" с функцией оболочки

Подпись: Джонатан Нидер

Точно так же, как присвоение непустого значения, присвоение пустого значения переменной оболочки при вызове функции приводит к непереносимому поведению : в некоторых оболочках присвоение длится в течение всего времени вызова функции, а в других оно сохраняется после возврата функции.

Используйте явную подрешетку с envvar"(с непустым VAR=value), который уже диагностируется автоматически" make test-lint "начиная с a0a630192d (t/check-non-portable-shell: detect "value", 2018-07-13).

Например, вместо того, чтобы:

FOO=bar shell_func

Использовать подоболочку:

GIT_TEST_PROTOCOL_VERSION= trace_fetch client origin to_fetch
Закрыть X