Unix 如何(逐行)订阅Clojure中阻塞shell命令的输出?
基本上,我想在某种对象中捕获shell命令的第一行输出(FIFO),无论是原子还是Unix 如何(逐行)订阅Clojure中阻塞shell命令的输出?,unix,clojure,core.async,Unix,Clojure,Core.async,基本上,我想在某种对象中捕获shell命令的第一行输出(FIFO),无论是原子还是chan。我已经研究了core.cache和core.async,但是我还没有找到任何方法可以克服sh(来自clojure.java.shell)仅在命令停止写入标准输出时返回值的问题。我如何访问它发出的数据?例如,我希望有一个对象,它的最新输出行是bspc subscribe,pactl subscribe,或者类似的东西 对于上下文,我已经为lemonbar编写了一个配置,它是一个状态栏,从标准输入读取数据并写
chan
。我已经研究了core.cache和core.async,但是我还没有找到任何方法可以克服sh
(来自clojure.java.shell
)仅在命令停止写入标准输出时返回值的问题。我如何访问它发出的数据?例如,我希望有一个对象,它的最新输出行是bspc subscribe
,pactl subscribe
,或者类似的东西
对于上下文,我已经为lemonbar编写了一个配置,它是一个状态栏,从标准输入读取数据并写入标准输出。目前,我有一组线程
可以休眠100ms并更新诸如wmctrl-d
、mpc current
之类的输出。我想在Bash中订阅这些事件(bspc subscribe | while read line…
)
谢谢。此解决方案使用
[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)))