首页 > 解决方案 > 如何在 Linux 管道中运行 clojure 文件?

问题描述

在 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)

标签: clojure

解决方案


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

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

推荐阅读