这是我正在尝试做的事情:
[[ "${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会挂起。任何想法,切肉刀朋友?
答案 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
几乎绝不是正确的事情......