我使用以下函数来运行shell命令:
(defun sh (cmd)
#+clisp (shell cmd)
#+ecl (si:system cmd)
#+sbcl (sb-ext:run-program "/bin/sh" (list "-c" cmd) :input nil :output*standard-output*)
#+clozure (ccl:run-program "/bin/sh" (list "-c" cmd) :input nil :output*standard-output*)))
例如,如何指定命令python -m CGIHTTPServer
的当前目录?
此致!
答案 0 :(得分:3)
在ECL中,您可以在SYSTEM之前使用EXT:CHDIR,它会更改 default-pathname-defaults 和当前目录的值,如操作系统和C库所理解的那样。
顺便说一下:如果可能的话,使用(EXT:RUN-PROGRAM“命令”list-of-args“
答案 1 :(得分:0)
更便携的方法是使用路径名并动态绑定*default-pathname-defaults*
,这将有效地设置您当前的工作目录。我今天遇到了同样的问题。以下是Conrad Barski对来自 Land of Lisp 文本的dot->png
的工作改编,它指定了当前的工作目录:
(defun dot->png (filespec thunk)
"Save DOT information generated by a thunk on a *STANDARD-OUTPUT* to a FILESPEC file. Then use FILESPEC to create a corresponding png picture of a graph."
;; dump DOT file first
(let ((*default-pathname-defaults*
(make-pathname :directory (pathname-directory (pathname filespec)))))
;; (format t "pwd (curr working dir): ~A~%" *default-pathname-defaults*)
(with-open-file (*standard-output*
filespec
:direction :output
:if-exists :supersede)
(funcall thunk))
#+sbcl
(sb-ext:run-program "/bin/sh"
(list "-c" (concatenate 'string "dot -Tpng -O " filespec))
:input nil
:output *standard-output*)
#+clozure
(ccl:run-program "/bin/sh"
(list "-c" (concatenate 'string "dot -Tpng -O" filespec))
:input nil
:output *standard-output*)))
希望这可能对处于类似情况的人有用。穿过这个线程。