基本上,我希望在某种对象(无论是原子还是chan )中捕获外壳命令的第一行输出(FIFO)。我已经研究过core.cache和core.async,但是我还没有找到任何可以克服以下问题的方法:sh (来自clojure.java.shell)只在命令停止写入标准输出时返回值。我如何才能访问它传出的数据?例如,我希望有一个对象,它最近的输出行是bspc subscribe、pactl subscribe或类似的东西。
对于上下文,我为lemonbar编写了一个配置,lemonbar是一个从标准输入读取并写入标准输出的状态栏。目前,我有一堆睡眠时间为100ms的Thread,可以更新wmctrl -d、mpc current等命令的输出。相反,我想订阅这些事件,就像在Bash (bspc subscribe | while read line ...)中一样。
谢谢。
发布于 2020-05-26 13:55:49
此解决方案使用[com.kohlschutter.junixsocket/junixsocket-core "2.3.2"]和[me.raynes/fs "1.4.6"]。
(ns so.unix-socket
(:require
[me.raynes.fs :as fs]
[clojure.java.io :as io])
(:import
(org.newsclub.net.unix AFUNIXServerSocket AFUNIXSocketAddress)))
(def file-name (fs/temp-file "abc"))
(.deleteOnExit file-name)
(def file (io/file file-name))
(def server (doto (AFUNIXServerSocket/newInstance)
(.. (bind (AFUNIXSocketAddress. file)))
(.. (setSoTimeout 10000))))
(future
(let [socket (.. server (accept))
rdr (io/reader (.getInputStream socket))]
(loop [line (.readLine rdr)]
(when (some? line)
(println line)
(recur (.readLine rdr))))))
(clojure.java.shell/sh "bash" "-c"
(format "pactl subscribe|socat STDIN UNIX-CONNECT:%s"
(.getAbsolutePath file-name)))https://stackoverflow.com/questions/62013777
复制相似问题