Я могу бежать, ENV_VAR=value command
чтобы бежать command
с определенным значением для ENV_VAR
. Что эквивалентно unset ENV_VAR
для command
?
cmd
для этого.
Я могу бежать, ENV_VAR=value command
чтобы бежать command
с определенным значением для ENV_VAR
. Что эквивалентно unset ENV_VAR
для command
?
cmd
для этого.
Ответы:
За исключением -i
опции, которая стирает всю среду, POSIX env
не предоставляет никакого способа сброса переменной.
Однако, с несколькими env
реализациями (включая GNU, busybox
'и, по крайней мере, FreeBSD), вы можете сделать:
env -u ENV_VAR command
Что будет работать при удалении каждого экземпляра ENV_VAR
переменной из среды (обратите внимание, что она не работает для переменной среды с пустым именем ( env -u ''
либо выдает ошибку, либо неэффективна в зависимости от реализации, даже если все принимают env '=value'
, возможно, ограничение понесенные unsetenv()
функции C , которая POSIX требует , чтобы вернуть ошибку для пустой строки, в то время как нет такого ограничения для putenv()
)).
Портативно (в оболочках POSIX) вы можете сделать:
(unset -v ENV_VAR; exec command)
(обратите внимание, что с некоторыми оболочками, использование exec
может изменить то, что command
запускается: запускает тот, что в файловой системе вместо функции или встроенной функции (например, и обойдется без alias
расширения, очевидно), как env
описано выше. Вы бы хотели опустить его в этих случаях) ,
Но это не сработает для переменных среды, имена которых не сопоставимы с переменной оболочки (обратите внимание, что некоторые оболочки, как, в mksh
любом случае, удаляют эти переменные из среды при запуске) или переменные, помеченные как доступные только для чтения.
-v
предназначен для оболочки Bourne и без bash
которого может сбросить функцию, если переменная с таким именем не существует. Большинство других оболочек не отменят функции, если вы не передадите опцию. (вряд ли что-то изменит на практике).unset
-v
ENV_VAR
-f
(Также остерегайтесь об ошибке / ошибочной особенности из bash
/ mksh
/ yash
которого unset
, при некоторых обстоятельства не могут сбросить переменные, но показывают переменный во внешней области видимости )
Если perl
доступно, вы можете сделать:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
Который будет работать даже для переменной среды с пустым именем.
Теперь все это не будет работать, если вы хотите изменить переменную среды для встроенной функции или функции и не хотите, чтобы они запускались в подоболочке, как в bash
:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(здесь отключение LANG как ошибочного подхода при проверке .
используется и понимается как десятичный разделитель. Было бы лучше использовать LC_ALL=C printf...
для этого)
С некоторыми оболочками вы можете вместо этого создать локальную область видимости для переменной, используя функцию:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
С помощью zsh
вы также можете использовать анонимную функцию:
(){local ENV_VAR; command}
Этот подход не будет работать в некоторых оболочках (например, основанных на оболочке 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 command)
(unset ENV_VAR; exec somecommand)
если вы хотите быть эквивалентны оригиналу по эффективности (потребляя подоболочку). Как это, это добавляет дополнительную вилку.
command
как это последняя команда в вызове подоболочки.
env -u
.
Вы можете использовать ENV_VAR= command
Это на самом деле не сбрасывает переменную, но может быть полезно во многих случаях (сценарии оболочки обычно просто используют test -n
для проверки, установлена ли переменная):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR:
command
неудачный выбор заполнителей, поскольку на самом деле есть встроенная команда с таким именем.mycommand
или что-somecommand
то подобное может стать лучшей привычкой.