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

时间:2012-03-15 03:05:23

标签: haskell

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

例如,我有两个命令"制作快照"和"备份快照" 第二个在第一个完成之前无法启动。 如果我按顺序将这两个命令粘贴在do语法中,它们会一个接一个地执行,还是我必须手动检查并确保第一个完成?

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

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

我宁愿使用" runCommand"为了上面的序列工作?我是否需要在进程句柄上调用wait?

感谢。

1 个答案:

答案 0 :(得分:11)

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

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

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

  

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

  

“system”和“runCommand”函数之间的区别

主要区别在于system正在阻止而runCommand未阻止。

  

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

不,在你的情况下,阻止通话就足够了。

  

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

仅当您决定使用非阻止呼叫时。

使用示例:

import System.Process
main = do
  ExitSuccess <- system "make snapshot"
  ExitSuccess <- system "backup snapshot"
  return ()