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

10
如果我处于需要按顺序执行外部命令的情况下,最佳解决方案是什么?
例如,我有两个命令"make snapshot"和"backup snapshot"。 第二个命令必须等到第一个完成后才能开始执行。 如果我把这两个命令有序地放在 do 语法中,它们会一个接一个地执行,还是我必须手动检查并确保第一个命令已经完成?
对于手动的完成检查,使用 "system" 或 "rawSystem" 并检查其退出代码是否足够吗?
我不完全理解 "system" 和 "runCommand" 函数之间的区别。有人能为我澄清一下吗?我只能看到它们返回不同的值:退出代码 vs 进程句柄。还有其他区别吗?
我是否需要使用 "runCommand" 来使上述序列工作?我需要在进程句柄上调用 wait 吗?
谢谢。
1个回答

14
我了解您正在使用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 ()

在你的示例中,你如何在运行第二个程序之前检查第一个程序成功终止? - r.sendecky
4
ExitSuccess <- system "make snapshot"system 调用的结果进行模式匹配,确保其返回 ExitSuccess。如果模式匹配失败,则会调用 IO 的 fail - rampion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接