【问题标题】:how to package shell script into a leiningen project如何将 shell 脚本打包到 leiningen 项目中
【发布时间】:2012-09-18 01:37:31
【问题描述】:

我有一个保存在 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 文件的唯一原因是,当标准输出包含大的内容(如视频)时,我无法完全弄清楚如何进行重定向。

文件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)))

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    两步:

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

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

    【讨论】:

    • :in 字符串被传递到您正在启动的进程的标准输入。因此这基本上启动 bash,然后将脚本代码写入 bash 标准输入,因此 bash 将执行该脚本。像你一样echo 'echo hello' | bash
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2011-12-07
      • 2015-06-13
      • 1970-01-01
      相关资源
      最近更新 更多