如何将shell脚本打包到leiningen项目中

时间:2012-09-18 01:37:32

标签: clojure leiningen

我在scripts/shell/record_video.sh中保存了一个shell脚本,我需要在其中一个项目中调用。

在代码中使用它的一个例子:

(defn save-mp4 [cam filename duration]
  (sh "scripts/shell/record_video.sh" (:i_url cam) filename (str duration)))

如果我上传到clojars,我如何能够jar项目以便包含shell脚本?


跟进

谢谢@Ankur。 (sh "bash" :in bash-command-string)超级有用。我首先需要.sh文件的唯一原因是因为当stdout包含大量内容(如视频)时,我无法弄清楚如何进行重定向。

文件scripts/shell/record_video.sh包含:

SRC=rtsp://$1:554/axis-media/media.amp?resolution=1920x1080
DST=$2
LEN=$3
openRTSP -4 -d $LEN -w 1440 -h 1080 -f 25 -u root pass $SRC > $DST 2> /dev/null

我不知道如何在不使程序内存消耗巨大的情况下翻译重定向(>)。 (sh "bash" :in bash-command-string)命令允许在没有shell脚本的情况下编写函数:

(defn save-mp4 [cam filename duration]
  (let [src (format "rtsp://%s:554/axis-media/media.amp?resolution=1920x1080" (:i_url cam))
        cmd (format "openRTSP -4 -d %d -w 1440 -h 1080 -f 25 -u root pass %s > %s 2> /dev/null"
                    duration src filename)]
    (sh "bash" :in cmd)))

2 个答案:

答案 0 :(得分:3)

两个步骤:

  • 将shell脚本打包为资源。
  • 使用java资源API读取shell脚本文件并使用 (sh "bash" :in file-str)

其中file str是使用资源API读取的shell脚本内容。

答案 1 :(得分:2)

你实际上有两个问题。首先,如何将文件放入jar文件中。其次,如何从jar文件中访问文件。

第一个很简单:在资源目录中包含该文件。该目录中的所有文件都包含在jar文件中。

第二个是更难的,因为sh将在磁盘上查找脚本,而不是嵌套在jar文件中。您可能必须使用class loader.getresource提取文件,然后将它们写入磁盘以执行它。

如何从jar中读取资源有discussion,最简单的是(clojure.java.io/resource "myscript.js")