将环境变量传递给一个进程

5

我刚刚看到了这段代码:

$ DEVELOPMENT=1 node dev-mode.js

这行代码运行了一个node.js程序,并设置了环境变量DEVELOPMENT。我不理解如何设置环境变量的机制?这种语法是有效的吗?

$ [var1=value1 var2=value2] [process_name process_params] ?

你想知道如何设置环境变量的方法吗? - Inian
我想了解有关设置环境变量的特定方式的详细信息。 - Max Koretskyi
@Maximus:如果我下面的回答是你想知道的,请告诉我。 - Inian
@JamesBrown 通过 FOO=bar /bin/echo $FOO 命令,仍然是父进程检索 FOO 变量。您需要使用FOO=bar sh -c '/bin/echo $FOO' 命令让子进程(在这种情况下是 shell 因为 echo 不执行这种操作)完成它。 - Petr Skocik
这是有关主题的讨论:https://dev59.com/v2w05IYBdhLWcg3wnjLC - James Brown
3个回答

6

有两种方法可以从当前Shell或运行的程序中设置传递变量,

一种方法是使用内置的 export 命令,并按照以下语法

$ export MYVALUE=5
$ echo "MYVALUE is $MYVALUE"
MYVALUE is 5

这种语法可以让变量在当前 shell 中生效,并在调用后续子 shell(如命令替换或进程替换等)中保持有效,即使子 shell 终止后,该变量仍然保持有效。

或者按照问题所述,如果您直接将其发送给命令:

$ MYVALUE=5 bash -c 'echo "MYVALUE is $MYVALUE"'
MYVALUE is 5

该值仅传递到子shell(使用bash -c启动的子shell),一旦退出就不会影响父shell。现在,您可以从上面的语法中观察到MYVALUE,它将为空。

$ echo $MYVALUE
$

希望这回答了你的问题。

第一个代码示例是误导性的,因为"MYVALUE is $MYVALUE"字符串由父shell解释,即使没有export$MYVALUE也会被展开。 - Petr Skocik

2

是的,这是一种有效的语法,在man bashSimple Commands部分中有描述:

简单命令是一个可选变量赋值序列, 后面跟着用空格隔开的单词和重定向, 并以控制运算符结尾。第一个单词指定要执行的命令,并传递为第零个参数。 其余单词作为参数传递给调用的命令。


2
这个例子应该演示以下内容:
X=0; Y=1;       #set X and Y
#set X, Y for the child and have it expand and print those vars
X=42 Y=43  sh -c 'echo $X $Y' 
#print the same vars in the parent
echo $X $Y      

The

var0=val0 var1=val1... command

语法使其表现得好像在命令之前的变量列表被暂时分配了相应的值,并且变量像被导出一样。
export var0

命令运行后,变量列表中的变量将恢复其原始值和导出状态(即它们是否自动传播到子进程)。

该示例打印

42 43 
0 1

谢谢,我的理解是$ X=0; Y=1;没有在前面加export,所以在$ sh -c 'echo $X $Y'中无法使用,是这样吗? - Max Koretskyi
在Bash中,您可以执行declare -p variable_name命令来显示变量的导出标志和其他属性。 您可以使用它来探索这些机制的行为。 就导出而言,Dash和其他Shell的行为相同(据我所知),但我不确定这种行为是否符合POSIX标准。 - Petr Skocik

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