2024 Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面了解此操作的更多信息。

最新的Clojure alpha版本添加了clojure.java.process命名空间。我需要在正在工作的Clojure程序中实现更好的进程创建处理,所以我调查了是否应该将我的Clojure依赖项更新到1.12.0-alpha2,我想就评估此命名空间时遇到的功能和错误提供反馈。

  1. 错误流->stdout重定向不工作
    当提供:err :stdout选项时,启动的进程不会将输出发送到stdout,因为第89行是getter。它应该是(.redirectErrorStream pb true)。你可以使用(exec {:out :inherit :err :stdout} "bash" "-c" "ls >&2")进行测试。

  2. 无法移除环境变量
    移除环境变量在启动进程时是一项有用的功能,甚至在ProcessBuilder的Javadoc中的示例中有所说明。我建议添加对删除环境变量的支持,通过将环境值设为nil作为请求从启动进程环境中删除环境变量。

  3. 无法覆盖exec的:err :inherit选项
    Exec文档表明可以覆盖exec的默认选项,但在第137行默认选项优先于用户提供的选项,它应该是(merge {:err :inherit} opts)

  4. 捕获kv-opt是:buffer-size而不是:buffer
    在第119行,capture文档字符串表示其kv-opt与jio/copy中的相同——:buffer:encoding,但jio/copy的kv-opt是:buffer-size:encoding

  5. 吹毛求疵:检查in/out/err/dir的真值是多余的
    第85-90行检查了选项的存在,这是不必要的,因为第75行为提供了默认值。

已关闭,备注: 大部分功能已在1.12.0-alpha4解决,其余功能即将推出
发表于
只是一个补充说明

babashka.process 有 :env 和 :extra-env。:env 用于替换环境变量(允许您复制当前的System/getenv并从中删除内容),而 :extra-env 只用于添加环境变量。与 ProcessBuilder 类似,:env 默认使用 System/getenv。

例如,要删除环境变量:

```
(require '[babashka.process :as p])

(let [env (-> (into {} (System/getenv))
              (dissoc "PATH"))]
  (p/shell {:env env} "bash" "-c" "echo $PATH"))
```

这比 nil 选项稍微详细一些,我也喜欢。

1 答案

+1 投票
发表于
已被选中 发表于
...