(sh & args)
传递给出的字符串到 Runtime.exec() 来启动一个子进程。
选项有:
:in :给出下列合法的输入源给 clojure.java.io/copy , 比如, InputStream , Reader , File , byte[] 或者 String , 来提供子进程的标准输入(stdin)。:in-enc :给出一个字符串。作为字符的编码名(比如, UTF-8 或者 ISO-8859-1)来转换 :in 中给定的字符串的编码,默认是 UTF-8 。 如果 :in 给出的字节数组(byte array), 那么它不会被解码,这个选项会被忽略。:out-enc :选项可以是一个 :bytes 或者一个 String , 如果给出的是一个 String , 它会被当作一个字符编码的名字,(比如, UTF-8 或者 ISO-8859-1)来转换子进程的标准输出的字符串编码,如果给出的是 :bytes , 子进程的标准输出会被存储到一个字节数组返回,默认是 UTF-8 。:env :用一个 map 重载进程的环境变量(env),如果你是一个受虐狂,你可以用一个 String[] 。:dir :用一个 String  或者  java.io.File  重载进程工作目录(dir)你可以用 with-sh-env 或者 with-sh-dir 绑定 :env 或者 :dir 到多个操作。
sh 返回一个 map :
:exit :子进程的返回码:out :子进程的标准输出(stdout)(byte[] 或者 String):err :子进程的标准错误(stderr)(用平台默认的编码的 String)user=> (use '[clojure.java.shell :only [sh]])
;; Note: The actual output you see from a command like this will look messier.
;; The output below has had all newline characters replaced with line
;; breaks.  You would see a big long string with \n characters in the middle.
user=> (sh "ls" "-aul")
{:exit 0,
 :out "total 64
drwxr-xr-x  11 zkim  staff    374 Jul  5 13:21 .
drwxr-xr-x  25 zkim  staff    850 Jul  5 13:02 ..
drwxr-xr-x  12 zkim  staff    408 Jul  5 13:02 .git
-rw-r--r--   1 zkim  staff     13 Jul  5 13:02 .gitignore
-rw-r--r--   1 zkim  staff  12638 Jul  5 13:02 LICENSE.html
-rw-r--r--   1 zkim  staff   4092 Jul  5 13:02 README.md
drwxr-xr-x   2 zkim  staff     68 Jul  5 13:15 classes
drwxr-xr-x   5 zkim  staff    170 Jul  5 13:15 lib
-rw-r--r--@  1 zkim  staff   3396 Jul  5 13:03 pom.xml
-rw-r--r--@  1 zkim  staff    367 Jul  5 13:15 project.clj
drwxr-xr-x   4 zkim  staff    136 Jul  5 13:15 src
", :err ""}
user=> (use '[clojure.java.shell :only [sh]])
user=> (println (:out (sh "cowsay" "Printing a command-line output")))
 _________________________________
< Printing a command-line output. >
 ---------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
nil
user=> (use '[clojure.java.shell :only [sh]])
nil
;; note that the options, like :in, have to go at the end of arglist
;; advantage of piping-in thru stdin is less need for quoting/escaping
user=> (println (:out (sh "cat" "-" :in "Printing input from stdin with funny chars like ' \" $@ & ")))
Printing input from stdin with funny chars like ' " $@ &
nil