【问题标题】:How do I run a clojure file in a Linux pipe?如何在 Linux 管道中运行 clojure 文件?
【发布时间】:2020-12-10 20:30:20
【问题描述】:

在 Linux 系统上,我想读取一些文本并将其作为参数传递给这样的 Clojure 文件

cat ./some-text.txt | clj ./solution.clj

我希望看到 Clojure 的一些输出打印到标准输出。 solution.clj 没有主函数,也没有声明任何命名空间。我使用 deps.edn 作为我的工具。有没有可能?

我在 9 年前看过关于 SO 的示例,但这些示例不再有效。

一些进展

我有这个脚本,我的文件给出了预期的输出,但我收到了一个警告,我不知道如何摆脱它。

脚本

#!/bin/bash

export OUTPUT_PATH=./out.txt
> ./out.txt
cat ./input0.txt | clj -Srepro ./solution.clj
cat ./out.txt

部分问题是脚本需要设置环境变量,这增加了我寻找解决方案的复杂性。在脚本中,我尝试了 clojure 和 clj。两者都发出警告。

警告

$ sh ./runme.sh 
WARNING: When invoking clojure.main, use -M
hello

如果脚本没有主函数,我如何摆脱警告?

代码

;; Complete the missingNumbers function below.

(defn missingNumbers [arr brr] (list "hello"))

(def fptr (get (System/getenv) "OUTPUT_PATH"))

(def n (Integer/parseInt (clojure.string/trim (read-line))))

(def arr (vec (map #(Integer/parseInt %) (clojure.string/split (read-line) #" "))))

(def m (Integer/parseInt (clojure.string/trim (read-line))))

(def brr (vec (map #(Integer/parseInt %) (clojure.string/split (read-line) #" "))))

(def result (missingNumbers arr brr))

(spit fptr (clojure.string/join " " result) :append true)
(spit fptr "\n" :append true)

【问题讨论】:

  • @cfrick 这看起来跟我一点关系都没有?
  • @cfrick 啊,当然。说得通。我将标记此评论线程以删除,因为不再需要。

标签: clojure


【解决方案1】:

如果您不需要 REPL,请运行 clojure 而不是 clj。使用-M 调用clojure.main,然后您可以提供文件参数:

cat ./some-text.txt | clojure -M ./solution.clj

【讨论】:

  • 它不起作用。警告仍然存在,输出打印两次
  • 重复的结果是因为没有清除out.txt,但警告仍然存在
  • 请贴出你的程序代码,让这个问题重现。
  • 你很接近:cat ./input0.txt | clojure -Srepro -M ./solution.clj
  • 摆脱 -Srepro 使脚本片段像您的答案一样工作。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
相关资源
最近更新 更多