【问题标题】:Pipe bash stdout only in "debug" mode仅在“调试”模式下使用管道 bash 标准输出
【发布时间】:2017-05-29 20:24:52
【问题描述】:

我正在努力实现这一目标:

PIPE=""
if [ $DEBUG = "true" ]; then
    PIPE="2> /dev/null"
fi
git submodule init $PIPE

$PIPE被解释为 git 的命令行参数。如何仅在调试模式下显示 stdoutstderr,而在非调试模式下仅显示 stderr


感谢您的精彩见解。最终这样做了,如果不在调试模式下,它将所有内容重定向到 /dev/null,并在调试模式下打印 stderr 和 stdout:

# debug mode
if [[ ${DEBUG} = true ]]; then
    PIPE=/dev/stdout
else
    PIPE=/dev/null
fi

git submodule init 2>"${PIPE}" 1>"${PIPE}"

【问题讨论】:

  • 您是否尝试过将$PIPE 放在反引号中? `$PIPE`
  • 谢谢,但这不起作用,仍然得到“line 17: 2>: command not found
  • 您使用的是什么版本的 bash?您的原始代码似乎在我的 Mac 版本 3.2.57(1)-release 上运行良好
  • GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
  • 您已经尝试只运行上面的这段代码,但您得到了那个错误?我基本上复制并粘贴了您的代码并添加了一行 $DEBUG="true" 并且我没有收到有关找不到命令的任何错误...

标签: bash pipe stdout stderr


【解决方案1】:

在 >

之后使用变量
if [[ ${DEBUG} = true ]]; then
    errfile=/dev/stderr
else
    errfile=/dev/null
fi

command 2>"${errfile}"

修改文件描述符

您可以将标准错误复制到新的文件描述符 3

if [[ ${DEBUG} = true ]]; then
    exec 3>&2
else
    exec 3>/dev/null
fi

那么对于每个你想使用新重定向的命令

command 2>&3

如果不再需要,关闭 fd 3

exec 3>&-

【讨论】:

  • 谢谢,但问题是如何使用 $PIPE 变量,如果可能的话。
  • 不可能在变量中使用重定向'>',因为重定向是在变量扩展之前完成的,但是您可以在>符号之后使用变量
  • So 2> 重定向stderr,但是如何用这种方式同时重定向stderr和stdout呢? 2>&1>/dev/null ?
  • 这也可以,顺便说一句...if [ "$DEBUG" != "true" ]; then exec 2> /dev/null; fi你也可以用[ "$DEBUG" == "true" ] || exec 2> /dev/null短路它
  • 是的,事实上这是我的主要想法,但有点累。 exec 3>&2 备份 fd2 然后 exec 2>/dev/null 最后在命令之后 exec 2>&3 3>&- 恢复 fd2 并关闭 fd3,但根据用户的使用情况,我虽然他可以使用普通 fd2 的命令git 命令之间
【解决方案2】:

首先我猜你的逻辑是错误的,使用 DEBUG=true 你会将标准错误发送到 /dev/null。此外,您的字符串比较缺少第二个“=”,

简单的解决方案怎么样?

if [ "${DEBUG}" == "true" ]; then
    git submodule init
else
    git submodule init  2>/dev/null
fi

根据您的回复进行编辑:

您也可以使用eval,但要小心它被认为是邪恶的;)

if [ "${DEBUG}" == "true" ]; then
    PIPE=""
else
    PIPE="2>/dev/null" 
fi 
eval git submodule init $PIPE

【讨论】:

  • 是的,谢谢,但我有一长串函数,这就是我想要 $PIPE 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多