如何在 Haskell 中判断 Linux 上是否安装了程序

Vil*_*son 1 bash haskell posix

我正在创建一个使用与服务器交互的外部程序的脚本。我想在尝试使用该程序之前先测试该程序是否已安装。

我查找了判断程序是否已安装的首选方法,并找到了这篇文章: How can I check if a program contains from a Bash script?

TLDR:它建议使用“command -v <prog-name>”而不是“which <prog-name>”,因为它是 POSIX 兼容的。如果找到程序,该命令应返回 0,否则返回 >0。

所以我从 System.Process 中使用readProcessWithExitCode如下

readProcessWithExitCode "command" ["-v", "<some-program>"] ""
Run Code Online (Sandbox Code Playgroud)

在 GHCI 中测试时出现以下错误

异常:命令:readCreateProcessWithExitCode:posix_spawnp:不存在(没有这样的文件或目录)

我尝试在“命令”上使用“which”。它告诉我它不存在,尽管我可以使用它,并且它的工作原理如我的终端中的手册页中所述。

这是怎么回事?我如何查看是否使用 Haskell 安装了某些内容?

一些系统信息:

  • GHC:9.0.2
  • 解析器:lts-19.11
  • “顺便说一句,我使用 Arch”

Dan*_*ner 5

我建议您只需运行您想要运行的程序,并捕获该程序不可用时出现的异常。像这样:

catch
    (callProcess "lol-this-does-not-exist" []) -- or whatever
    (\e -> if isDoesNotExistError e then putStrLn "yikes" else throw e)
Run Code Online (Sandbox Code Playgroud)

  • @leftaroundabout 我完全不同意。只需运行您实际想要运行的命令即可。如果您真正想要的是运行“mpv my-fair-lady.mp3”,则运行“mpv my-fair-lady.mp3”,而不是“mpv --version”。 (3认同)