在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