运行程序时如何设置和取消设置环境变量?

运行程序时如何设置和取消设置环境变量?

假设我有一个program依赖于通过设置环境变量进行某些配置的程序。现在我也不想用 10 个不同的环境变量污染我的本地环境,所以我认为在这种情况下脚本会很方便:

set VAR1=...
set VAR2=...
.
.
# run the program
./program

unset VAR1
unset VAR2
.
.

./program因此,我现在将运行此脚本,而不是运行。我的问题是,这是惯用的做事方式吗?我应该知道更好的方法吗?

答案1

在类似 Bourne 或rc类似 shell 中,要将环境变量仅传递给一个命令的一次调用,您可以这样做:

VAR1=value VAR2=other-value some-command with its args

但请注意,在某些 shell 中, ifsome-command是特殊的内置函数(例如exportseteval)或函数,之后变量仍保持设置状态(尽管并不总是导出)。

csh 或 tcsh shell 没有等效项,但在这些 shell(或任何相关 shell)中,您始终可以使用以下env命令:

env VAR1=value VAR2=other-value some-command with its args

env如果您想传递名称不是有效 shell 变量名称的环境变量(尽管不建议使用此类变量),您还需要在类似 Bourne 的 shell 中使用,例如:

env C++=/usr/bin/g++ some-command with its args

请注意,在 csh 中,set var=value设置的是 shell 变量,而不是您需要的环境变量setenv var value

fishshell 中,您可以set -lxbegin...end语句中使用来限制变量的范围,同时仍将其导出到环境中:

begin
  set -lx VAR1 value
  set -lx VAR2 other-value
  some-command with its args
end

zsh您可以使用匿名函数执行相同的操作:

(){
  local -x VAR1=value VAR2=other-value
  some-command with its args
  some-other-command with other args
}

或者:

function {
  local -x VAR1=value VAR2=other-value
  some-command with its args
  some-other-command with other args
}

VAR1=value VAR2=other-value some-command with its args不过,只有当您想在该环境中运行多个命令时,您才更喜欢使用标准语法。

在任何类似 Bourne 的 shell 中,您还可以使用子 shell 限制变量赋值的范围:

(
  VAR1=value VAR2=other-value
  export VAR1 VAR2
  some-command with its args
  some-other-command with other args
)

POSIX shell(不是 Bourne shell,尽管 Bourne shell 已经成为过去)也可以在参数中对export特殊内置函数进行赋值:

(
  export VAR1=value VAR2=other-value
  some-command with its args
  some-other-command with other args
)

该方法还可以用于(t)csh

(
  setenv VAR1 value
  setenv VAR2 other-value
  some-command with its args
  some-other-command with other args
)

要在使用名称不是有效 shell 变量名的变量的环境中运行多个命令,您始终可以使用envstart zshbashcsh任何其他不会从环境中删除这些变量的 shell:

# most shell syntax:
env C++=/usr/bin/g++ zsh -c '
  some-command with its args
  some-other-command with other args
'
# (t)csh syntax
env C++=/usr/bin/g++ csh -c '\
  some-command with its args\
  some-other-command with other args\
'

另请注意,unset设置变量(unset var在 (t)csh 和大多数类似 Bourne 的 shellunset -v varbash、在类似 shellvar = ()中的in 中使用)与恢复旧变量值不同。在上面的所有示例代码之后,只有最初未设置的变量最终才会被取消设置。rcset -e varfish

答案2

如果运行程序是您在脚本中执行的最后一件事,即您无需担心在脚本的剩余时间内“污染”环境,则无需取消设置变量。导出环境变量仅影响当前进程及其子进程;您无法更改父进程的环境。当脚本退出时,变量就消失了。

顺便说一句,您需要使用export将变量导出到环境中,set仅在 shell 中本地设置它们。

相关内容