Я могу бежать, ENV_VAR=value command
чтобы бежать command
с определенным значением для ENV_VAR
. Что эквивалентно unset ENV_VAR
для command
?
shell
environment-variables
Алексей романов
источник
источник
command
неудачный выбор заполнителей, поскольку на самом деле есть встроенная команда с таким именем.mycommand
или что-somecommand
то подобное может стать лучшей привычкой.cmd
для этого.Ответы:
За исключением
-i
опции, которая стирает всю среду, POSIXenv
не предоставляет никакого способа сброса переменной.Однако, с несколькими
env
реализациями (включая GNU,busybox
'и, по крайней мере, FreeBSD), вы можете сделать:Что будет работать при удалении каждого экземпляра
ENV_VAR
переменной из среды (обратите внимание, что она не работает для переменной среды с пустым именем (env -u ''
либо выдает ошибку, либо неэффективна в зависимости от реализации, даже если все принимаютenv '=value'
, возможно, ограничение понесенныеunsetenv()
функции C , которая POSIX требует , чтобы вернуть ошибку для пустой строки, в то время как нет такого ограничения дляputenv()
)).Портативно (в оболочках POSIX) вы можете сделать:
(обратите внимание, что с некоторыми оболочками, использование
exec
может изменить то, чтоcommand
запускается: запускает тот, что в файловой системе вместо функции или встроенной функции (например, и обойдется безalias
расширения, очевидно), какenv
описано выше. Вы бы хотели опустить его в этих случаях) ,Но это не сработает для переменных среды, имена которых не сопоставимы с переменной оболочки (обратите внимание, что некоторые оболочки, как, в
mksh
любом случае, удаляют эти переменные из среды при запуске) или переменные, помеченные как доступные только для чтения.-v
предназначен для оболочки Bourne и безbash
которого может сбросить функцию, если переменная с таким именем не существует. Большинство других оболочек не отменят функции, если вы не передадите опцию. (вряд ли что-то изменит на практике).unset
-v
ENV_VAR
-f
(Также остерегайтесь об ошибке / ошибочной особенности из
bash
/mksh
/yash
которогоunset
, при некоторых обстоятельства не могут сбросить переменные, но показывают переменный во внешней области видимости )Если
perl
доступно, вы можете сделать:Который будет работать даже для переменной среды с пустым именем.
Теперь все это не будет работать, если вы хотите изменить переменную среды для встроенной функции или функции и не хотите, чтобы они запускались в подоболочке, как в
bash
:(здесь отключение LANG как ошибочного подхода при проверке
.
используется и понимается как десятичный разделитель. Было бы лучше использоватьLC_ALL=C printf...
для этого)С некоторыми оболочками вы можете вместо этого создать локальную область видимости для переменной, используя функцию:
С помощью
zsh
вы также можете использовать анонимную функцию:Этот подход не будет работать в некоторых оболочках (например, основанных на оболочке Almquist), которые
local
не объявляют переменную как изначально не установленную (но наследуют значение и атрибуты). В тех, которые вы можете сделатьlocal ENV_VAR; unset ENV_VAR
, но не делайте этого вmksh
илиyash
(typeset
вместоlocal
этого), так как это не сработает,unset
будет только отменаlocal
.Be Также имейте в
bash
виду, что локальныйENV_VAR
(хотя и не установленный) сохранит атрибут экспорта . Таким образом, если бы этоcommand
была функция, которая присваивает значениеENV_VAR
, переменная была бы доступна в среде команд, вызываемых впоследствии.unset ENV_VAR
очистит этот атрибут. Или вы можете использоватьlocal +x ENV_VAR
метод, который также обеспечит чистую доску (если эта переменная не была объявлена только для чтения, но тогда вы ничего не можете с этим поделатьbash
).источник
env '=foo' python -c 'import os; print os.environ[""]'
. Я не ожидаю, что многие люди захотят установить такую переменную.Насколько я знаю, прямого эквивалента нет; Вы можете использовать подоболочку:
источник
(unset ENV_VAR; exec somecommand)
если вы хотите быть эквивалентны оригиналу по эффективности (потребляя подоболочку). Как это, это добавляет дополнительную вилку.command
как это последняя команда в вызове подоболочки.env -u
.Вы можете использовать
ENV_VAR= command
Это на самом деле не сбрасывает переменную, но может быть полезно во многих случаях (сценарии оболочки обычно просто используют
test -n
для проверки, установлена ли переменная):источник