我正在编写一个clojure cli,并想知道是否有办法测试 out (即println)是否正在写入控制台或是否正在通过管道传输给另一个程序?
这与this问题类似,但对于clojure。
答案 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文件来避免内部管道。