我想设置 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)
这是怎么回事?为什么没有设置变量?
默认情况下,所有用户定义的变量都是本地的。它们不会导出到新流程。使用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)
由于您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 中执行。)