Сбросить переменную среды для одной команды

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

FOO=bar somecommand

Что если мы хотим сбросить переменную для одной команды?

2 ответа

Решение

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

FOO= some command

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

env -u FOO somecommand
env -u FOO somecommand

Это удалит переменную среды FOO от somecommand среда процесса.

И чтобы сбросить несколько переменных:

env -u FOO -u FOO2 somecommand

Для тех, кто намеревается запустить команду без каких-либо переменных среды, вы можете сделать это, запустив:

env -i somecommand

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

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

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

См. Коммит d6509da, коммит a7fbf12, коммит c7973f2 (26 декабря 2019 г.) Джонатан Нидер (artagnon).
(Слияние Junio ​​C Hamano -gitster- в коммите c7372c9, 30 января 2020 г.)

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

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

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

Используйте явную подоболочку с envvarэкспортировано, чтобы сделать поведение одинаковым для всех оболочек и кристально чистым.

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

Например, вместо:

GIT_TEST_PROTOCOL_VERSION= trace_fetch client origin to_fetch

Используйте подоболочку:

(
    GIT_TEST_PROTOCOL_VERSION= &&
    export GIT_TEST_PROTOCOL_VERSION &&
    trace_fetch client origin to_fetch
) &&
...
Другие вопросы по тегам