Как выполнить разделение строки в качестве аргумента Clojure.shell/sh - PullRequest
0 голосов
/ 12 июля 2019

У меня есть команда вроде:

(clojure.java.shell/sh "curl" "https://somesite.com" "-F" "file=@somefile.txt")

и я хочу создать функцию, которая будет запускать стандартные команды оболочки, которые я предоставляю ... что-то вроде этого:

(defn run-shell-command [command]
  (clojure.java.shell/sh (clojure.string/split command #" ")))

чтобы я мог назвать это так:

(run-shell-command "curl https://somesite.com -F file=@somefile.txt")

но это бросает:

Unhandled java.lang.IllegalArgumentException
   No value supplied for key: ["curl" "https://somesite.com" "-F" "file=@somefile.txt"]

Как мне сделать эту работу?

(конечно, открыты для лучших идей, как это сделать)

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

Ваш вопрос является распространенным среди новичков: если у нас есть функция, принимающая аргументы, как мы можем применить функцию к списку этих аргументов?

(defn f [a b c] (+ a b c))

(def args [1 2 3])

Ответ, как указано выше, метод применяется .Метод применяет функцию к списку аргументов.Так в приведенном выше примере:

(= (f 1 2 3)
   (apply f args))

т.е.

(defn run-shell-command [command]
  (apply clojure.java.shell/sh (clojure.string/split command #" ")))
1 голос
/ 12 июля 2019

Вы также можете использовать базовый командный процессор для обработки строки.Например, используя bash:

(clojure.java.shell/sh "bash" "-c" command)

... оберните его в функцию и, если хотите, скройте командный процессор:

(defn run-shell-command [command]
  (clojure.java.shell/sh "bash" "-c" command))

, тогда вы можете использовать любые команды оболочки bash.Например,

(run-shell-command "for i in $(ls); do echo $i; done")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...