Haskell:严格按顺序执行外部命令

r.s*_*cky 7 haskell

如果我需要按顺序执行外部命令,那么最佳解决方案是什么?

例如,我有两个命令"make snapshot"和"backup snapshot".第二个命令在第一个完成之前无法启动.如果我有条不紊地将这两个命令粘贴在do语法中,它们会一个接一个地执行,还是我必须手动检查并确保第一个完成?

对于手动完成检查,是否足以使用"system"或rawSystem"并检查它们的退出代码?

我不完全理解"system"和"runCommand"函数之间的区别.有人可以向我澄清这一点.我只能看到它们返回不同的值:退出代码与进程句柄.还有其他差异吗?

我是否宁愿使用"runCommand"来完成上述序列?我是否需要在进程句柄上调用wait?

谢谢.

Rot*_*sor 11

我知道您正在使用System.Process模块来运行外部命令.这很好.

该模块包含阻塞和非阻塞IO操作.非阻塞的(如createProcess,runCommand)创建一个进程并立即返回其句柄,同时它仍在运行.阻塞的(比如readProcess,system)不返回任何句柄,而是在终止后返回运行进程的结果.

要确保进程已终止,您需要使用阻塞操作或使用阻塞,waitForProcess直到具有给定句柄的进程终止.

是否足以使用"system"或rawSystem"并检查他们的退出代码?

是.

"system"和"runCommand"函数之间的区别

主要区别在于system阻塞而runCommand不是.

我是否宁愿使用"runCommand"来完成上述序列?

不,在您的情况下,阻止呼叫应该足够了.

我是否需要在进程句柄上调用wait?

仅当您决定使用非阻塞呼叫时.

用法示例:

import System.Process
main = do
  ExitSuccess <- system "make snapshot"
  ExitSuccess <- system "backup snapshot"
  return ()
Run Code Online (Sandbox Code Playgroud)

  • @ r.sendecky:`ExitSuccess < - system"make snapshot"`对`system`调用的结果进行模式匹配 - 确保它返回`ExitSuccess`.如果模式匹配失败,则调用[IO的`fail`](http://en.wikibooks.org/wiki/Haskell/do_Notation#Translating_the_bind_operator). (4认同)