在 Bash 脚本中设置环境变量

3
我想设置两个临时环境变量,然后运行一个可执行文件。
命令如下:
ENV_1=firstparam ENV_2=secondparam my_binary

我想把bash脚本中的2个环境变量赋值移到一个命令中,类似这样:

setparams.sh my_binary

setparams.sh

#!/bin/bash
ENV_1=firstparam
ENV_2=secondparam

这里出了什么问题?为什么变量没有被设置?


你的“脚本”只需是 ENV_1=firstparam ENV_2=secondparam "$1" - chepner
你所拥有的是变量赋值。你根本没有使用环境变量;你所拥有的变量是 shell 内部的。 - William Pursell
1
使用 "$@" 而不是 "$1" 可以让你向命令传递额外的参数。 - Keith Thompson
@WilliamPursell 在问题中的第一条命令ENV_1=firstparam ENV_2=secondparam my_binary中,这些变量被作为环境变量传递给了my_binary(但它们在此之后不会保留)。 - Keith Thompson
@KeithThompson 没错。我当时只是关注于这个例子,但显然脚本应该能够接受二进制文件的参数。 - chepner
显示剩余2条评论
3个回答

8

默认情况下,所有用户定义的变量都是局部的。它们不被导出到新进程。使用export命令来导出变量和函数。

export ENV_1=firstparam
export ENV_2=secondparam

此外,应该使用source命令来代替执行(source是一个内置命令,用于在当前shell中执行传递的文件内容):

source setparams.sh && my_binary

5

既然您正在将my_binary作为脚本的参数传递,我假设您想让脚本(a)设置环境变量,然后(b)调用您发送给它的命令。

其中一种方法是:

#!/bin/bash

ENV_1=firstparam ENV_2=secondparam "$@"

"

"$@"扩展为您传递给脚本的参数列表。

如果您设置了这样的变量,它们将被继承到您运行的任何命令的环境中在同一命令行上,但不会被后续的任何命令继承。

如果您想要使用这些环境变量执行多个命令,可以执行以下操作:

"
#!/bin/bash

export ENV_1=firstparam
export ENV_2=secondparam
some_command
some_other_command

然后在some_commandsome_other_command的环境变量中将出现$ENV_1$ENV_2--但在set_params.sh完成后,不会出现在你的shell环境变量中。

如果你想要一个脚本能够设置环境变量,并且这些变量将在你的交互式shell中可用,你需要使用命令. ./set_params.shsource ./set_params.sh来调用它。(在这种情况下,你不需要在顶部加上#!/bin/bash,因为它将在当前shell中执行。)


尽管我在谈论环境变量,但我只是指设置一些变量以供后续命令使用。 - alfredopacino

0
你需要导出你的环境变量:

setparams.sh

#!/usr/bin/env bash

# Export environment variables
export ENV_1=firstparam
export ENV_2=secondparam

# Launch binary with its provided arguments
"$@"

测试一下:

./setparams.sh bash -c 'echo "$ENV_1"'

输出:

firstparam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接