sh¶
(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