在bash中的命令之前设置一个环境variables不适用于pipe道中的第二个命令

在给定的shell中,通常我会设置一个或多个variables,然后运行一个命令。 最近我学到了将一个variables定义添加到一个命令的概念:

FOO=bar somecommand someargs 

这工作…种。 当你改变一个LC_ *variables(这似乎影响命令而不是它的参数,例如'[az]'字符范围),或者当输出到另一个命令时,它不起作用:

 FOO=bar somecommand someargs | somecommand2 # somecommand2 is unaware of FOO 

我可以用“FOO = bar”来预先指定一些命令2,它可以工作,但是会增加不必要的重复,并且不依赖于根据variables解释的参数(例如'[az]')

那么,在一条线上做这件事的好方法是什么? 我正在考虑的事情是:

 FOO=bar (somecommand someargs | somecommand2) # Doesn't actually work 

编辑:我有很多很好的答案! 目标是保持这一点,最好不用“出口”。 使用调用bash的方法总体上是最好的,虽然其中的“导出”的括号版本更紧凑一些。 使用redirect而不是pipe道的方法也很有趣。

 FOO=bar bash -c 'somecommand someargs | somecommand2' 

如何导出variables,但只在子壳内?

 (export FOO=bar && somecommand someargs | somecommand2) 

基思有一个观点,要无条件地执行命令,这样做:

 (export FOO=bar; somecommand someargs | somecommand2) 

你也可以使用eval

 FOO=bar eval 'somecommand someargs | somecommand2' 

由于这个答案与eval似乎并不是每个人都高兴,让我澄清一些事情:当使用书面, 用单引号 ,这是完全安全的。 这是好事,因为它不会启动外部进程(如接受的答案),也不会在额外的子shell中执行命令(如其他答案)。

正如我们得到一些定期的意见,可能是一个替代eval取悦所有人,并有这个快速eval “诡计”的所有好处(甚至更多!)可能是好的。 只要使用一个function! 用你所有的命令定义一个函数:

 mypipe() { somecommand someargs | somecommand2 } 

并用你的环境variables来执行它:

 FOO=bar mypipe 

如何使用shell脚本?

 #!/bin/bash # myscript FOO=bar somecommand someargs | somecommand2 > ./myscript