想知道这个问题有一段时间了,但总是忘记问
如果我们有这样的管道:
a | b
有没有办法单独设置环境变量,如下所示:
x="foo" a | x="bar" b
答案1
您喜欢做的事情与标准相冲突,因为标准定义 shell 宏扩展发生在特定环境设置之前。
还有一种方法可以做你喜欢的事情,因为 POSIX 需要 a 之前的环境语句special shell builtin
来影响整个 shell。该:
命令是这样的special shell builtin
。
尝试:
(x="foo" :; a) | (x="bar" :; b)
这需要在子 shell 中完成,以防止主 shell 进程受到影响。如果你替换a
并且b
现在echo $x,
将打印OP在他的评论中所期望的内容:
(x="foo" :; echo $x) | (x="bar" :; echo $x)
嗯,管道左侧的输出丢失了……
但由于您已经需要使用子 shell,因此您可以使用:
(x="foo"; echo $x) | (x="bar"; echo $x)
它使用语法首先在子 shell 中设置 shell 变量,然后使用它。如果您需要x
在命令中作为环境,则需要export x
在后一个示例中。