gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:11:20 25 4
gpt4 key购买 nike

基本上,我想在某种对象中捕获 shell 命令的第一行输出 (FIFO),无论是原子还是 chan .我查看了 core.cache 和 core.async,但我还没有找到任何可以克服 sh 的问题的方法。 (来自 clojure.java.shell )仅在命令停止写入标准输出时返回一个值。我如何访问它发出的数据?例如,我想要一个具有最新输出行 bspc subscribe 的对象。 , pactl subscribe ,或类似的东西。

对于上下文,我为柠檬栏编写了一个配置,它是一个从标准输入读取并写入标准输出的状态栏。目前,我有一堆 Thread s sleep 100 毫秒并更新诸如 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)))

关于unix - 如何在 Clojure 中(逐行)订阅阻塞 shell 命令的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62013777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com