0

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

[[ "${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,我的外壳就会挂起。有什么想法吗,刀友们?

4

2 回答 2

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"
}
于 2013-09-27T22:03:21.140 回答
0

在一个脚本中,

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

实际上就是你要找的。但是您可能不想在交互式外壳中执行此操作。

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

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

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

于 2013-09-27T22:03:31.363 回答