Clojure:如何判断出是出于控制台还是正在进行管道传输?

时间:2015-01-29 00:12:49

标签: clojure command-line-interface

我正在编写一个clojure cli,并想知道是否有办法测试 out (即println)是否正在写入控制台或是否正在通过管道传输给另一个程序?

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您可以使用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)

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