[英]How do I use the output of readProcess in an xmonad keybinding?
好的,所以前段時間,我正在考慮根據框上腳本的輸出,在xmonad中建立鍵綁定的效果。 我最終出於不相關的原因決定不這樣做,但是最近我確實嘗試做類似的事情,就像學習Haskell的練習一樣。
因此,給定功能:
test = readProcess "echo" ["-n", "gvim"] []
由於測試返回IO String並生成一個String,所以拋出該錯誤。
((modm, xK_y), spawn ("xmessage " ++ test))
好。 這很酷。 我知道IO操作是不可預測的,因此應將其分開。 精細。 所以我在網上做了一些探索(刪除了xmessage,只是想自己通過測試的輸出):
((modm, xK_y), liftIO test >>= spawn)
這更糟。 它煩人地編譯,但是當我嘗試綁定時什么也沒有發生。 (我也將其替換為僅生成“ xmessage test”,並且有效)
因此,我當時以為“我的功能也許有問題”,所以我將其替換,但是從GCHi中我得到了“ gvim”,這是正確的。 因此,我將其寫入haskell文件:
main = test >>= putStrLn
test = readProcess "echo" ["-n", "gvim"] []
也可以正常工作。
那么,我哪里出錯了?
編輯:解決方案是使用runProcessWithInput
而不是readProcess
。 相關鏈接: https: //ghc.haskell.org/trac/ghc/ticket/5212 xmonad io綁定不起作用
更新資料
顯然,解決方案(請參閱下面的注釋)是使用readProcessWithInput
原始答案
你之前這么說:
liftIO test >>= spawn
沒用,但是如何:
liftIO test >>= (\m -> spawn ("xmessage " ++ m))
還要注意, readProcess
返回的字符串可能在末尾有換行符,這可能會影響事情。
為此,您可以嘗試其他一些方法:
return "gvim" >>= (\m -> spawn ("xmessage " ++ m))
import Data.Char
do { m <- liftIO test; spawn ("xmessage " ++ (filter isAlpha m)) }
第一個應該成功,因為它等效於spawn "xmessage grim"
。 第二個將從test
的輸出中刪除所有換行符(實際上,任何非字母)。
其他一些事情可能會揭示正在發生的事情:
使用以下內容創建一個名為/tmp/report
的腳本:
#!/bin/sh ( date; echo "/tmp/report was called with args" "$@") >> /tmp/output
使/tmp/report
可執行。
/tmp/report
並驗證兩行是否附加到/tmp/output
spawn "/tmp/report A"
。 通過查看預期行是否附加到/tmp/output
來測試操作。 嘗試執行monad操作:
liftIO (readProcess "/tmp/report" ["B"] "") >> spawn "/tmp/report A"
(請注意,我們使用>>
這里,不是>>=
)。當你觸發動作,你應該可以看到一個報告線B
呼叫,還一個是A
電話。
根據您在文件/tmp/output
看到的內容,您應該能夠確定readProcess
命令是否正在執行以及spawn
命令是否正在觸發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.