【问题标题】:mongo command writes to standard output AND pipemongo 命令写入标准输出和管道
【发布时间】:2020-12-09 10:19:47
【问题描述】:

当命令通过管道传输时,mongo 命令仍然在标准输出上显示结果,我无法理解这一事实:

mongo --quiet  localhost:7017/admin -u $mongo_rootuser -p $mongo_rootpw --eval "JSON.stringify(db.getUsers())" | <whatever command processes the output>

我不应该在控制台上看到任何打印内容,因为命令的结果是通过管道传输的。

请问有什么解决方法吗? (除了要求 mongo 开发人员尊重基本的 posix)

【问题讨论】:

  • 您可能会看到输出到 fd 2 而不是 1 的错误
  • 不,这是命令的常规输出(在这种情况下,mongo 返回我的用户)
  • 将完整的输出添加到问题和所需的输出中。

标签: mongodb bash mongodb-query


【解决方案1】:

您没有使用管道捕获 STDOUT - 您只是在使用命令的结果。将整个输出重新路由到您想要的任何位置,然后您可以使用它做一些事情 - 但请注意,它也会给您带来所有错误和完整的响应:

mongo --quiet  localhost:7017/admin -u $mongo_rootuser -p $mongo_rootpw --eval "JSON.stringify(db.getUsers())" >> /var/log/whatever.log 2>&1

grep /var/log/whatever.log | <whatever command>

【讨论】:

  • 我不想使用临时文件。
  • 问题是恕我直言,您没有明确说明您想要什么以及为什么不使用临时文件-我的意思是您要如何区分 STDERR 和 STDOUT。
  • 问题是,当使用--eval 时,mongo 仍然会打印出东西,即使输出应该是管道的。打印出来的不是 STDERR,它只是常规输出。就像您执行ls -lh | &lt;whatever command&gt; 一样,输出通过管道传输并显示。没有预期
【解决方案2】:

抱歉打扰了,我设法找到了解决方法,仍然对其他人有用。

我把mongo命令放在一个变量里:

result=$(mongo --quiet  localhost:7017/admin -u $mongo_rootuser -p $mongo_rootpw --eval "JSON.stringify(db.getUsers())")
echo $result | <whatever command>

注意:此问题已在 https://jira.mongodb.org/browse/SERVER-23810 中解决,但没有解决方法

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2012-02-23
    • 2010-12-03
    • 2013-07-23
    相关资源
    最近更新 更多