2014-07-22 19 views
4

我想遷移現有的makefile動搖,到目前爲止,我已經試過以下(只創建一個目錄內容的文件)使用搖

module Main where 
import Development.Shake 

main :: IO() 
main = shakeArgs shakeOptions{shakeFiles="_build"} $ do 
    let ls = "_build/ls.txt" 
    want [ls] 
    ls *> \out -> do 
     cmd "ls > " out 

當我如何執行sh命令運行它,我得到以下錯誤信息:

> runghc test.hs _build/ls.txt 
# ls (for _build/ls.txt) 
ls: >: No such file or directory 
ls: _build/ls.txt: No such file or directory 
Error when running Shake build system: 
* _build/ls.txt 
Development.Shake.cmd, system command failed 
Command: ls > _build/ls.txt 
Exit code: 1 
Stderr: 
ls: >: No such file or directory 
ls: _build/ls.txt: No such file or directory 

我在做什麼錯了?你如何執行sh命令並重定向其輸出?

回答

11

首先你可能想轉換:

cmd Shell "ls >" out 

的說法Shell告訴搖使用該系統的外殼,這意味着重定向作品。後來你可能希望切換到:

Stdout result <- cmd "ls" 
writeFile' out result 

現在,你是不是調用外殼,但捕捉與搖輸出。一段時間後,你可能希望切換到:

getDirectoryFiles "." ["*"] 

這是該抖動跟蹤得到的文件列表的方式。

+1

'殼'確實工作。爲什麼需要呢?我以爲'cmd'已經在運行一個shell命令,不是嗎? – mb14

+2

不,'cmd'直接運行命令,通過'exec'(如果這是C)。避免使用'Shell'通常會提供跨平臺的更多可預測的行爲,避免啓動shell,使得轉義更簡單等。 –