Linux 尝试在bash中使用变量将stderr重定向到/dev/null

Linux 尝试在bash中使用变量将stderr重定向到/dev/null,linux,bash,redirect,exec,eval,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" ]] && 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就会挂起。有什么想法吗,克利弗朋友

创建另一个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 != debug ]] && exec 2>/dev/null
这就是你要找的。但您可能不想在交互式shell中执行此操作

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

因此,当您在交互式shell中
exec2>/dev/null
时,bash会继续工作,它甚至会继续倾听您的声音,但它无法再响应。所以它看起来像是挂着的,但那只是一种错觉。尝试键入
Echo hello,me
(无法查看您键入的内容),当您按enter键时,您将看到Echo的结果,就像正常情况一样


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

它甚至发生在不同的fd而不是
2>
,并且对于不同的shell,例如Bourne shell(
sh
),如果选择任何其他数字,结果都是一样的:“失去shell交互”。