独立为管道子shell设置环境变量

独立为管道子shell设置环境变量

想知道这个问题有一段时间了,但总是忘记问

如果我们有这样的管道:

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在后一个示例中。

相关内容