Clojure:如何判断 out 是要控制台还是正在管道?

Clojure: how to tell if out is going to console or is being piped?

我正在编写一个 clojure cli,想知道是否有办法测试 out(即 println)是否正在写入控制台或正在被传送到另一个程序?

这类似于 this 问题,但针对 clojure。

Clojure 是托管语言,因此系统交互相关的东西或多或少等同于 Java。对于 Java,仅存在 this answer 中描述的部分解决方案。您当然可以使用 JNI 实现 isatty(),然后从 Clojure 进行互操作。

但是,从 Node.js 上托管的 ClojureScript 可以使用 process.stdin.isTTY 轻松实现(在 ClojureScript 中是 (-> process .-stdin .-isTTY))。 this answer.

中有更多详细信息

你可以使用 jnr-posix Java 库

[com.github.jnr/jnr-posix "3.0.10"]

直接从 Clojure 调用本机 posix 方法(使用 Java Interop):

(import 'jnr.posix.POSIXFactory)

(def posix (POSIXFactory/getPOSIX))
(.isatty posix java.io.FileDescriptor/out)

N.B. 如果你 运行 你的 Clojure 应用程序使用 lein run 命令,Clojure 将无法识别 TTY 终端因为 lein 将在两个 java 进程之间通过内部管道 stdio 。您可以使用 lein trampoline run 命令或编译的 jar 文件来避免内部管道。