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交互”。