我刚刚看到了这段代码:
$ DEVELOPMENT=1 node dev-mode.js
这行代码运行了一个node.js程序,并设置了环境变量DEVELOPMENT
。我不理解如何设置环境变量的机制?这种语法是有效的吗?
$ [var1=value1 var2=value2] [process_name process_params] ?
有两种方法可以从当前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是的,这是一种有效的语法,在man bash
的Simple Commands
部分中有描述:
简单命令是一个可选变量赋值序列, 后面跟着用空格隔开的单词和重定向, 并以控制运算符结尾。第一个单词指定要执行的命令,并传递为第零个参数。 其余单词作为参数传递给调用的命令。
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 Koretskyideclare -p variable_name
命令来显示变量的导出标志和其他属性。 您可以使用它来探索这些机制的行为。 就导出而言,Dash和其他Shell的行为相同(据我所知),但我不确定这种行为是否符合POSIX标准。 - Petr Skocik
FOO=bar /bin/echo $FOO
命令,仍然是父进程检索 FOO 变量。您需要使用FOO=bar sh -c '/bin/echo $FOO'
命令让子进程(在这种情况下是 shell 因为 echo 不执行这种操作)完成它。 - Petr Skocik