HasKell中的readProcess分別獲取命令名和它的參數。我想執行命令,因爲我已經將它完全輸入到shell中,例如。 「ls -la」。主要問題是我不知道如何執行一些管道命令等,所以通過提供完整的命令執行readProcess
./someprogram -s 2> /dev/stdin | grep string
似乎不可能。我不能簡單地將它傳遞給命令名稱,因爲它會拋出異常。那我該怎麼做呢?
HasKell中的readProcess分別獲取命令名和它的參數。我想執行命令,因爲我已經將它完全輸入到shell中,例如。 「ls -la」。主要問題是我不知道如何執行一些管道命令等,所以通過提供完整的命令執行readProcess
./someprogram -s 2> /dev/stdin | grep string
似乎不可能。我不能簡單地將它傳遞給命令名稱,因爲它會拋出異常。那我該怎麼做呢?
這些不是您通常期望操作系統或過程庫爲您提供的功能。它們是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.
我的目的是達到os.popen()的標準輸出讀取的Python稱爲()功能。它在那裏沒有問題... – Ikciwor
System.Process.callCommand – amalloy
@amalloy不會返回命令 – Lazersmoke