设置子shell的环境变量

设置子shell的环境变量

我知道我可以使用这样的环境变量运行命令:

FOO=bar mycommand

我知道我可以在子 shell 中运行命令,如下所示:

(firstcommand && secondcommand)

但我能以某种方式将这两者结合起来吗?

FOO=bar (firstcommand && secondcommand)

给出:

sh: syntax error: unexpected "("

至少在 busybox shell (ash) 中是这样。

编辑:库萨拉南达建议FOO=bar sh -c 'first && second'这确实是一个解决方案。但是,我也对替代答案感兴趣,因为我喜欢子 shell 语法,因为它不需要摆弄引号转义。

答案1

单程:

FOO=bar sh -c 'first && second'

FOO为单个sh命令设置环境变量。

设置多个环境变量:

FOO=bar BAZ=quux sh -c 'first && second'

export另一种方法是在子 shell 内创建变量和它。在子 shell 内部执行操作export可确保外壳不会在其环境中获取变量:

( export FOO=bar; first && second )

总结(现已删除)注释:需要export创建一个环境变量(而不是 shell 变量)。环境变量的问题是它们被子进程继承。如果firstsecond是查看其环境的外部实用程序(或脚本),那么FOO如果没有export.

答案2

使用&&运算符将​​子 shell 声明连接到环境变量赋值语句:

FOO=bar && (firstcommand && secondcommand)

例如:

GREETING='Hello' && ( echo "${GREETING}, friend!" )
# Hello, friend!

&&还克服了一个相关问题,其中命令将使用事先的变量的值(如果使用新值作为命令的前缀重新定义该变量):

GREETING='Halt'
GREETING='Hello' && echo "${GREETING}, friend!"
# Hello, friend!

没有&&

GREETING='Halt'
GREETING='Hello' echo "${GREETING}, friend!"
# Halt, friend!
# OOPS!

答案3

您可以将声明放入子 shell 中:

( export FOO=bar; firstcommand && secondcommand )

或 POSIXly,

( export FOO; FOO=bar; firstcommand && secondcommand )

答案4

对于一般导出,请在顶部 makefile 中添加此行

SHELL:=NODE_PATH=. ${SHELL}

其中“NODE_PATH=”。是一个示例 var

我在这个示例项目中使用它:

https://github.com/rzr/webthing-iotjs/blob/sandbox/rzr/node/master/Makefile#L24

相关内容