【问题标题】:How to execute system commands?如何执行系统命令?
【发布时间】:2011-10-07 18:33:59
【问题描述】:

如何在 Clojure 中执行系统特定的命令并获得它们的响应?例如,假设我们在一台 Linux 机器上,我如何调用 topfree,并获取它们的结果以进行进一步处理?

【问题讨论】:

    标签: clojure


    【解决方案1】:
    (use '[clojure.java.shell :only [sh]])
    (sh "free")
    (sh "top" "-bn1")
    

    另请参阅:http://clojuredocs.org/clojure_core/clojure.java.shell/sh

    【讨论】:

    • 感谢您的示例和链接。 clojure.java.shell/sh 在 Linux 机器上运行良好,但在 Windows 机器上不行; Windows 有不同的外壳吗?
    • 我没有看到 Windows 有任何问题,(sh "calc") 在我的系统上正常工作。和 (sh "notepad" "C:/windows/WindowsUpdate.log") 一样。您的系统上的这个解决方案有什么问题?
    • @NielsK:我在调用 cmd 提示符并将命令传递给它时遇到了麻烦,即sh "cmd" "dir"
    • @sjac:要让命令处理器为您执行命令,您需要使用/C 选项,即(未经测试):sh "cmd" "/C" "dir"。这由(在 DOS 窗口中)help cmd 解释。
    • @PrayagUpd 这听起来像是一个不同的问题。您应该单独询问,并提供更多详细信息。
    【解决方案2】:

    您应该可以按如下方式使用 Java Runtime.exec 方法:

    (import 'java.lang.Runtime)
    
    (. (Runtime/getRuntime) exec "your-command-line-here")
    

    Runtime.exec 方法返回一个Process 对象,您可以根据需要查询该对象以获取标准输出等。

    【讨论】:

    • 如果命令有参数,不要忘记使用字符串数组:(. (Runtime/getRuntime) exec (into-array ["command" "arg1" "arg2"]))
    【解决方案3】:

    如果您愿意在抽象方面做得更高一些(尽管没有那么高),我会推荐Conch,因为我发现它可以编写非常可读的代码。

    【讨论】:

      【解决方案4】:

      您可以使用 babashka 库在 Clojure 中运行 shell 命令。一个例子是

      #!/usr/bin/env bb
      (require '[clojure.java.shell :refer [sh]])
      (sh "top")
      

      【讨论】:

        猜你喜欢
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        相关资源
        最近更新 更多