在 bash 脚本中设置环境变量

alf*_*ino 3 bash

我想设置 2 个临时环境变量,然后运行一个二进制文件。

命令是这样的:

ENV_1=firstparam ENV_2=secondparam my_binary
Run Code Online (Sandbox Code Playgroud)

我想在 bash 脚本中移动 2 个环境变量分配并使用如下命令:

setparams.sh my_binary
Run Code Online (Sandbox Code Playgroud)

setparams.sh

#!/bin/bash
ENV_1=firstparam
ENV_2=secondparam
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?为什么没有设置变量?

Gon*_*heu 8

默认情况下,所有用户定义的变量都是本地的。它们不会导出到新流程。使用export命令导出变量和函数

export ENV_1=firstparam
export ENV_2=secondparam
Run Code Online (Sandbox Code Playgroud)

另外,您应该调用source(在当前 shell 中执行作为参数传递的文件内容的内置命令),而不是执行:

source setparams.sh && my_binary
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 5

由于您my_binary作为参数传递给脚本,我假设您希望脚本 (a) 设置环境变量,然后 (b) 调用您发送给它的命令。

一种方法是:

#!/bin/bash

ENV_1=firstparam ENV_2=secondparam "$@"
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想使用这些环境变量执行多个命令,您可以这样做:

#!/bin/bash

export ENV_1=firstparam
export ENV_2=secondparam
some_command
some_other_command
Run Code Online (Sandbox Code Playgroud)

然后$ENV_1and将出现在and$ENV_2的环境中——但完成后不会出现在 shell 的环境中。some_commandsome_other_commandset_params.sh

如果您希望脚本设置可在交互式 shell 中使用的环境变量,则必须使用. ./set_params.sh或调用它source ./set_params.sh。(在这种情况下,您不需要#!/bin/bash顶部的 ,因为它将在您当前的 shell 中执行。)