尝试使用Variable将stderr重定向到bash中的/ dev / null

时间:2013-09-27 21:54:39

标签: linux bash redirect exec eval

这是我正在尝试做的事情:

[[ "${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会挂起。任何想法,切肉刀朋友?

2 个答案:

答案 0 :(得分:0)

创建另一个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"
}

答案 1 :(得分:0)

在剧本中,

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

实际上就是你要找的东西。但是你可能不想在交互式shell中这样做。

Bash使用stderr来处理一些非常重要的事情,而不只是提醒您有关错误情况的信息。首先,它使用stderr打印命令提示符,并(通常)回显您键入的字符,以便您可以看到它们。

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

顺便说一下,你试图做什么?压制/dev/stderr几乎绝不是正确的事情......