【问题标题】:Trying to use Variable to redirect stderr to /dev/null in bash尝试使用变量将 stderr 重定向到 bash 中的 /dev/null
【发布时间】:2013-09-27 21:54:38
【问题描述】:

这是我想要做的:

[[ "${1}" == "debug" ]] && DEBUG='2>/dev/null' || DEBUG=''

{
    echo "a b c"
    echo "d e f" >&2
} ${DEBUG}

这不起作用,因为“sh: 意外标记 `${BLAH}' 附近的语法错误”。我可以做类似的事情,像这样:

eval echo "def" ${DEBUG}

但我不能用一大段代码来做到这一点。另一种方法可能是使用“exec”在我的其余代码中进行重定向,例如:

[[ "${1}" == "debug" ]] && exec 2>/dev/null

但如果我尝试以特定方式使用 exec,我的 shell 会挂起。有什么想法吗,刀友们?

【问题讨论】:

    标签: linux bash redirect exec eval


    【解决方案1】:

    创建另一个 fd:

    [[ "${1}" == "debug" ]] && exec 7>/dev/null || exec 7>&2
    
    {
        echo "a b c"
        echo "d e f" >&7
    }
    

    顺便说一句,您确定在提到 debug 参数时输出应该被取消,或者相反?

    实际上更好的方法是创建一个函数:

    if [[ "${1}" == "debug" ]]; then
        function debug {
            echo "$1" >&2
        }
    else
        function debug {
            :
        }
    fi
    
    {
        echo "a b c"
        debug "d e f"
    }
    

    【讨论】:

      【解决方案2】:

      在脚本中,

      [[ $1 != debug ]] && exec 2>/dev/null
      

      实际上是您正在寻找的。但您可能不想在交互式 shell 中执行此操作。

      Bash 将stderr 用于一些非常重要的事情,而不仅仅是提醒您有关错误情况。一方面,它使用stderr 打印命令提示符,并且(通常)回显您键入的字符,以便您可以看到它们。

      所以当你在交互式 shell 中exec 2>/dev/null 时,bash 继续工作,它甚至继续听你的声音,但它不再响应。所以它看起来像它的“挂”,但这只是一种错觉。尝试输入Echo hello, me(看不到您输入的内容),当您按回车键时,您将看到回显的结果,就像正常情况一样。

      顺便问一下,你想做什么?压制/dev/stderr 几乎从来都不是正确的事情……

      【讨论】:

      • 它甚至发生在不同的 fd 而不是 2> 和不同的 shell 上,比如 _Bourne Shel_l (sh) 如果你选择任何其他数字,结果是相同:“失去外壳交互”。
      猜你喜欢
      • 2011-05-14
      • 2018-02-25
      • 2021-08-19
      • 2012-01-23
      • 2019-10-11
      • 2017-07-21
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多