假设我有一个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
是特殊的内置函数(例如export
、set
、eval
)或函数,之后变量仍保持设置状态(尽管并不总是导出)。
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
。
在fish
shell 中,您可以set -lx
在begin...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 变量名的变量的环境中运行多个命令,您始终可以使用env
start zsh
、bash
或csh
任何其他不会从环境中删除这些变量的 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 var
中bash
、在类似 shellvar = ()
中的in 中使用)与恢复旧变量值不同。在上面的所有示例代码之后,只有最初未设置的变量最终才会被取消设置。rc
set -e var
fish
答案2
如果运行程序是您在脚本中执行的最后一件事,即您无需担心在脚本的剩余时间内“污染”环境,则无需取消设置变量。导出环境变量仅影响当前进程及其子进程;您无法更改父进程的环境。当脚本退出时,变量就消失了。
顺便说一句,您需要使用export
将变量导出到环境中,set
仅在 shell 中本地设置它们。