首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Clojure中订阅(逐行)阻塞shell命令的输出?

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

Stack Overflow用户
提问于 2020-05-26 10:40:10
回答 1查看 195关注 0票数 4

基本上,我希望在某种对象(无论是原子还是chan )中捕获外壳命令的第一行输出(FIFO)。我已经研究过core.cache和core.async,但是我还没有找到任何可以克服以下问题的方法:sh (来自clojure.java.shell)只在命令停止写入标准输出时返回值。我如何才能访问它传出的数据?例如,我希望有一个对象,它最近的输出行是bspc subscribepactl subscribe或类似的东西。

对于上下文,我为lemonbar编写了一个配置,lemonbar是一个从标准输入读取并写入标准输出的状态栏。目前,我有一堆睡眠时间为100ms的Thread,可以更新wmctrl -dmpc current等命令的输出。相反,我想订阅这些事件,就像在Bash (bspc subscribe | while read line ...)中一样。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-05-26 13:55:49

此解决方案使用[com.kohlschutter.junixsocket/junixsocket-core "2.3.2"][me.raynes/fs "1.4.6"]

代码语言:javascript
复制
(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)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62013777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档