如何使用Shake执行sh命令

mb1*_*b14 5 haskell shake-build-system

我正在尝试将现有的makefile迁移到Shake,到目前为止我已尝试过以下内容(只需创建一个包含目录内容的文件)

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
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下错误消息:

> 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
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何执行sh命令并重定向其输出?

Nei*_*ell 12

要开始转换,您可能需要:

cmd Shell "ls >" out
Run Code Online (Sandbox Code Playgroud)

该参数Shell告诉Shake使用系统shell,这意味着重定向有效.稍后您可能希望切换到:

Stdout result <- cmd "ls"
writeFile' out result
Run Code Online (Sandbox Code Playgroud)

现在您不是在调用shell,而是使用Shake捕获输出.稍后,您可能希望切换到:

getDirectoryFiles "." ["*"]
Run Code Online (Sandbox Code Playgroud)

这是Shake跟踪获取文件列表的方式.

  • 不,`cmd`直接运行命令,通过`exec`(如果这是C).避免"Shell"经常提供跨平台更可预测的行为,避免启动shell,使转义更简单等. (2认同)