Сбросить переменную среды для одной команды
В 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
) &&
...