我知道我可以使用这样的环境变量运行命令:
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 变量)。环境变量的问题是它们被子进程继承。如果first
和second
是查看其环境的外部实用程序(或脚本),那么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