Unix 如何(逐行)订阅Clojure中阻塞shell命令的输出?

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编写了一个配置,它是一个状态栏,从标准输入读取数据并写

基本上,我想在某种对象中捕获shell命令的第一行输出(FIFO),无论是原子还是
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)))