首页 文章

在bash中的命令之前设置环境变量不适用于管道中的第二个命令

提问于
浏览
273

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

FOO=bar somecommand someargs

这工作......有点儿 . 当你改变一个LC_ *变量(它似乎影响命令而不是它的参数,例如'[a-z]'字符范围)或者输出到另一个命令时,它不起作用:

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

我可以在somecommand2之前添加“FOO = bar”,这可以工作,但会增加不需要的重复,并且它对根据变量解释的参数没有帮助(例如'[a-z]')

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

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

编辑:我有很多好的答案!目标是保持这个单线,最好不使用“导出” . 使用bash调用的方法总体上是最好的,尽管带有“export”的括号版本更紧凑 . 使用重定向而不是管道的方法也很有趣 .

4 回答

  • 243

    你也可以使用 eval

    FOO=bar eval 'somecommand someargs | somecommand2'
    

    由于 eval 的这个答案似乎并不能让所有人满意,所以让我澄清一下:当使用单引号书面时,它是完全安全的 . 这很好,因为它不会启动外部进程(如接受的答案),也不会在额外的子shell中执行命令(如另一个答案) .

    当我们得到一些常规观点时,给予每个人满意的_535696的替代方案可能是好的,并且具有这种快速 eval “技巧”的所有好处(甚至可能更多!) . 只需使用一个功能!使用所有命令定义函数:

    mypipe() {
        somecommand someargs | somecommand2
    }
    

    并使用您的环境变量执行它,如下所示:

    FOO=bar mypipe
    
  • 30

    如何使用shell脚本?

    #!/bin/bash
    # myscript
    FOO=bar
    somecommand someargs | somecommand2
    
    > ./myscript
    
  • 161
    FOO=bar bash -c 'somecommand someargs | somecommand2'
    
  • -5

    如何导出变量,但只在子shell内?

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

    Keith有一个观点,无条件执行命令,执行此操作:

    (export FOO=bar; somecommand someargs | somecommand2)
    

相关问题