clojure.java.shell/launch 不排空输出,导致进程挂起。以下是一个使用curl下载和打印1MB文本的示例
$ clj
Clojure 1.11.0-alpha4
user=> (require '[clojure.java.shell :refer [launch]])
nil
user=> (launch "curl" "https://gist.githubusercontent.com/khaykov/a6105154becce4c0530da38e723c2330/raw/41ab415ac41c93a198f7da5b47d604956157c5c3/gistfile1.txt")
我认为解决方案是将clojure.java.shell从该特定功能中的(.exit (Runtime/getRuntime))
移动到,并使用java.lang.ProcessBuilder
代替,它有一个选项可以丢弃输出。
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/ProcessBuilder.Redirect.html#DISCARD
一个注意事项:DISCARD仅在Java 9及更高版本中可用。我们可以在顶层使用try/catch来解决是否存在DISCARD的问题,如果可用则使用它,如果不可用则回退到.PIPE。其他选择:使用线程在进程运行时消耗输出。或将输出重定向到临时文件。
如果需要,我将提供补丁,并在达成解决方案方向共识后提供。