【问题标题】:clojure -- how to run a program without piping it's output?clojure - 如何在不通过管道输出的情况下运行程序?
【发布时间】:2011-10-24 17:32:47
【问题描述】:

我想使用 shell-out [http://richhickey.github.com/clojure-contrib/shell-out-api.html] 之类的东西,但不捕获任何输出。当然可以将输出传递给打印,但这有点不理想(例如,在子进程可能失败的情况下)。

编辑

抱歉,我希望子进程输出到与父进程相同的stdout

【问题讨论】:

  • 您想使子进程静音( > /dev/null )还是希望子进程使用与父进程相同的标准输出?在任何情况下,您都可以使用全系列的 JDK 类。
  • 后者;该问题已被编辑。

标签: shell clojure subprocess


【解决方案1】:

编辑:澄清之前

您可以使用 sh 包装 shell 命令,然后像这样通过管道传输到 /dev/null:

 (clojure.java.shell/sh "sh" "-c" "echo hello > /dev/null")
 ;; {:exit 0, :out "", :err ""}

这将在进入 clojure 之前使输出静音。

编辑:澄清后

只要输出足够快,就可以将输出和标准错误传递给打印。如果您想要连续输出错误消息和标准输出,查看“sh”函数的源代码应该会有所帮助。

就我个人而言,我会制作自己的 clojure.java.shell/sh 版本,并为每个流创建一个线程,使用来自 org 的 IOUtils.copy 之类的东西将输出直接通过管道传输到 out。 apache.commons.io.IOUtilsin

【讨论】:

  • 调用系统外壳是完全不可移植的。此外,使用Process.exec() 似乎无法做到这一点。我猜便携式版本将不得不等到 Java 7 的 ProcessBuilder 发布。
  • 如果您没有足够及时地读取输出,则该进程可能会阻止对其标准输出的写入并似乎挂起。 stderr 也一样
  • @Arthur,是的,如果一切都被杀死,打印可能不会执行,并且您可能会错过来自子进程的部分输出的有价值的调试信息。
【解决方案2】:

另请参阅此第三方库

https://github.com/Raynes/conch

它提供对流的直接访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多