取消设置一个命令的环境变量

取消设置一个命令的环境变量

我可以运行以特定值ENV_VAR=value command运行。相当于 unset for 的是什么?commandENV_VARENV_VARcommand

答案1

除了-i擦除整个环境的选项之外,POSIXenv不提供任何取消设置变量的方法。

然而,通过一些env实现(至少包括 GNUbusybox和 FreeBSD),您可以这样做:

env -u ENV_VAR command

这将有助于ENV_VAR从环境中删除变量的每个实例(请注意,它不适用于具有空名称的环境变量(env -u ''要么给出错误,要么根据实现而无效,即使全部接受env '=value',可能是一个限制)由 C 函数引起unsetenv(),POSIX 要求返回空字符串错误,而 )) 则没有这样的限制putenv()

可移植地(在 POSIX shell 中),您可以执行以下操作:

(unset -v ENV_VAR; exec command)

(请注意,对于某些 shell,使用exec可以更改command运行的命令:运行文件系统中的命令而不是函数或内置命令(并且alias显然会绕过扩展),如上env所示。在这些情况下,您需要忽略它) 。

但这不适用于名称不可映射到 shell 变量的环境变量(请注意,某些 shellmksh无论如何都会在启动时从环境中删除这些变量)或已标记为只读的变量。

-v用于 Bourne shell,如果没有bash它可以取消设置unset-vENV_VAR 功能如果没有多变的以这个名字。大多数其他 shell 不会取消设置函数,除非您传递该-f选项。 (在实践中不太可能产生影响)。

bash(还要注意//mksh的bug/ yashmisfeatureunset在某些情况下可能不会取消设置变量,但是显示外部作用域中的变量

如果perl有的话,你可以这样做:

perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command

即使对于名称为空的环境变量,这也适用。

现在,如果您想更改内置函数或函数的环境变量并且不希望它们在子 shell 中运行,那么所有这些都将不起作用,如下所示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...它)

对于某些 shell,您可以使用函数为变量创建本地作用域:

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}

该方法在某些 shell 中不起作用(例如基于 Almquist shell 的 shell),这些 shelllocal不会将变量声明为最初未设置(但继承值和属性)。在这些中,您可以执行local ENV_VAR; unset ENV_VAR,但不要在mkshor yashtypeset而不是local那个)中执行此操作,因为那样行不通,unset只会取消local.

还请注意,在 中bash,本地ENV_VAR(即使未设置)将保留出口属性。因此,如果command是一个为 赋值的函数ENV_VAR,则该变量将在随后调用的命令的环境中可用。unset ENV_VAR会清除该属性。或者您可以使用local +x ENV_VAR它也可以确保一个干净的状态(除非该变量已被声明为只读,但您在 中对此无能为力bash)。

答案2

据我所知,没有直接的等价物;你可以使用子shell:

(unset ENV_VAR; exec command)

答案3

您可以使用ENV_VAR= command

这实际上并没有取消设置变量,但它在许多情况下可能很有用(shell 脚本通常仅用于test -n检查变量是否已设置):

$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR: 

相关内容