1

我使用以下函数来运行 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

真挚地!

4

2 回答 2

3

在 ECL 中,您可以在 SYSTEM 之前使用 EXT:CHDIR,它会更改默认路径名默认值和当前目录的值,正如操作系统和 C 库所理解的那样。

顺便说一句:如果可能,请改用 (EXT:RUN-PROGRAM "command" list-of-args)

于 2012-09-25T14:22:22.653 回答
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*)))

发布希望这对处于类似情况并在此线程中运行的人有用。

于 2014-04-18T18:15:38.497 回答