Может ли кто-нибудь объяснить мне sh в clojure, чтобы выполнить системную команду?

Я использую Mac OS. Я хочу выполнить системную команду с помощью (use '[clojure.java.shell :only [sh]]), например, Как выполнять системные команды? . Я прочитал https://clojuredocs.org/clojure.java.shell/sh но не мог понять, сколько параметров можно передать в одном синтаксисе и т. д.

В Windows я пробовал (sh "cmd" "/C" "dir"), и он работал, но в Mac OS как мне выполнить приведенный выше синтаксис? Более того, я хочу передать больше параметров, чем просто dir. Например, я хочу выполнить (sh "cmd" "/c" "mged" "test.g"). ПРИМЕЧАНИЕ: mged и test.g относятся к Brl-Cad.

Я хочу нарисовать сферу, используя приведенный выше пример.


person Vikram Shaw    schedule 26.06.2019    source источник


Ответы (2)


В MacOS или Linux это работает:

user=> (require '[clojure.java.shell :as sh])
nil
user=> (sh/sh "ls" "-la")
...
person Michiel Borkent    schedule 26.06.2019
comment
Извините, что вернулся к вам через столько дней, и спасибо за объяснение. Это код, который я использую (ns vikram-cad.core (:require [clojure.java.shell :refer [sh]])) (defn example [] (println (:out (sh "mged" "test.g")))). Можете ли вы помочь мне создать базу данных с любым именем ex test.g и сферу с функцией sh в clojure? - person Vikram Shaw; 08.07.2019
comment
После выполнения вышеуказанных кодов я получаю эту ошибку Execution error (IOException) at java.lang.ProcessImpl/forkAndExec (ProcessImpl.java:-2). error=2, No such file or directory - person Vikram Shaw; 08.07.2019

clojure.java.shell просто порождает процесс с заданными аргументами (а также :env, :dir и ... - см. Документ). Итак, во-первых, в OSX / Unix, скорее всего, нет cmd, но обычно есть оболочка. И "то же самое", что и cmd /c на оболочке, -c. -c принимает один аргумент, и вы можете написать там свой "шелл-код" - это означает, что вы можете использовать каналы, перенаправления, env-vars, ... - так что если вы просто хотите запустить инструмент с param, используйте:

(sh "mged" "test".g")

Если вы хотите использовать "функции оболочки":

(sh "/bin/sh" "-c" "echo ${TERM} | tr x u")

(обратите внимание, что «код оболочки» - это всего лишь один аргумент)

person cfrick    schedule 26.06.2019
comment
Извините, что вернулся к вам через столько дней, и спасибо @cfrick за объяснение. Итак, теперь я могу использовать функцию sh в программе clojure, и теперь она тоже работает, но этот (sh "mged" "test.g) не работает, значит, он не создает базу данных с именем test.g. Это код, который я использую (ns vikram-cad.core (:require [clojure.java.shell :refer [sh]])) (defn example [] (println (:out (sh "mged" "test.g")))). Можете ли вы помочь мне создать базу данных и сферу с функцией sh в clojure? - person Vikram Shaw; 08.07.2019
comment
Если у вас есть ошибки или вы понимаете свою проблему, отредактируйте свой вопрос. Скорее всего, результат sh есть что-то полезное - так что не смотрите просто на :out. - person cfrick; 08.07.2019
comment
После выполнения вышеуказанного кода я получаю эту ошибку Execution error (IOException) at java.lang.ProcessImpl/forkAndExec (ProcessImpl.java:-2). error=2, No such file or directory - person Vikram Shaw; 08.07.2019
comment
Тогда скорее всего mged не на вашем пути - person cfrick; 08.07.2019
comment
Но я уже добавил путь. /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:Applications/BRL-CAD\ \:\ MGED\ 7.24.0.app/Contents/Resources/rel-7.24.0/bin:/opt/X11/bin - person Vikram Shaw; 09.07.2019
comment
Почему бы вам тогда просто не использовать абсолютный путь к этому двоичному файлу? - person cfrick; 09.07.2019
comment
Я пробовал это с абсолютным путем, но получал ту же ошибку. - person Vikram Shaw; 10.07.2019