2017-04-22 75 views
0

HasKell中的readProcess分別獲取命令名和它的參數。我想執行命令,因爲我已經將它完全輸入到shell中,例如。 「ls -la」。主要問題是我不知道如何執行一些管道命令等,所以通過提供完整的命令執行readProcess

./someprogram -s 2> /dev/stdin | grep string 

似乎不可能。我不能簡單地將它傳遞給命令名稱,因爲它會拋出異常。那我該怎麼做呢?

+1

System.Process.callCommand – amalloy

+1

@amalloy不會返回命令 – Lazersmoke

回答

3

這些不是您通常期望操作系統或過程庫爲您提供的功能。它們是shell語言的特徵(即,無論您使用哪種語言)(即sh/dash/bash/zsh等)。因此,你必須調用作爲外殼的過程中,與整個命令參數:

Prelude System.Process> readProcess "bash" ["-c", "lsusb | grep 'Real'"] "" 
"Bus 001 Device 003: ID 0bda:57b5 Realtek Semiconductor Corp. \n" 

當然,這不會是沒有安裝猛砸,就像Windows的系統上運行。

一個更好的方法是而不是調用任何shell管道和grep,但在Haskell本身進行搜索。該turtle庫使得這個簡單:

Prelude Turtle> :set -XOverloadedStrings 
Prelude Turtle> stdout . grep (has "Real") $ inproc "lsusb" [] empty 
Bus 001 Device 003: ID 0bda:57b5 Realtek Semiconductor Corp. 
+0

我的目的是達到os.popen()的標準輸出讀取的Python稱爲()功能。它在那裏沒有問題... – Ikciwor

相關問題