【问题标题】:What's the correct way to redirect both stdout and stderr in bash? [duplicate]在bash中重定向stdout和stderr的正确方法是什么? [复制]
【发布时间】:2013-09-08 14:06:09
【问题描述】:

这是我要完成的具体任务。 zsh 的行为是我喜欢的方式

$ zsh
$ which clang > /dev/null 2&>1 && echo clang || echo gcc
clang
$ which doesntexist > /dev/null 2&>1 && echo doesntexist || echo gcc
gcc

但是,在 bash 中:

$ bash
$ which clang > /dev/null 2&>1 && echo clang || echo gcc
gcc

这是一般情况:

$ which clang > /dev/null 2&>1; echo $?
1
$ which clang; echo $?
/usr/bin/clang
0

我重定向输出的方式有问题。正确的方法是什么?

【问题讨论】:

    标签: bash zsh


    【解决方案1】:

    我认为您的重定向方式错误:

    which clang > /dev/null 2&>1; echo $?
    

    应该是

    which clang > /dev/null 2>&1; echo $?
    

    这可能是任何一种外壳都允许前一种方法的方式。在 bash 中,这不是正确的方法。 Bash 会将其解释为:

    which clang >/dev/null 2 &>1; echo $?
    

    其中2 作为参数添加。

    您可以通过创建类似的函数来验证这一点

    e() { echo "$@" >e.log; }
    

    并将其称为:

    e 1 >/dev/null 2&>/dev/null
    

    你会在 e.log 中得到1 2

    在 bash 中,如果你这样调用你的命令也会更简单:

    which clang &>/dev/null; echo $?
    

    也不要调用像which 这样的外部二进制文件,而是使用type -P。也不需要重定向 stderr 输出。

    type -P clang >/dev/null; echo $?
    

    【讨论】:

      【解决方案2】:

      使用这个:

      which gcc >& /dev/null && echo gcc || echo clang
      

      你也可以使用这个:

      [[ $(which gcc) ]] && echo gcc || echo clang # prints gcc
      [[ $(which clang) ]] && echo gcc || echo clang # prints clang
      

      这很有效,因为在[[ ]] 中,空字符串是错误的。

      【讨论】:

        【解决方案3】:

        您正在使用 zsh 的 &> 运算符,它重定向 stderr 和 stdout。您使用它的方式表明您的意思是 ... > /dev/null 2>&1

        我会这样做:

        $ cc=$( type -P clang gcc othercc | head -n 1 )
        $ echo $cc
        /usr/bin/clang
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-16
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          相关资源
          最近更新 更多