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

标签 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 就会挂起。刀友们有什么想法吗?

最佳答案

创建另一个文件描述符:

[[ "${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"
}

关于linux - 尝试在bash中使用变量将stderr重定向到/dev/null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19060692/

相关文章:

javascript - 返回修改后的 URL 的上一页

linux - Imagemagick 的导入速度慢得令人沮丧

linux - 连续循环 SQlite3 数据库,当查询找到前 3 个运行脚本时

bash - 如何替换shell脚本字符串中的变量

redirect - 如何在 directadmin 保持 HTTPS/SSL 的情况下将域 B 指向域 A 而无需重定向?

javascript - 旧代码 : window. Parent.location.href ="https:/home"

c - 当套接字在队列之后打开时,共享套接字描述符在消息队列上无效

linux - 操作系统内 2 个进程之间的双向消息传递

r - 无法在 Linux 服务器上安装任何 R 包

linux - Bash - 将一些具有相同扩展名和不同名称的文件复制到多个名为类似文件的文件夹中