2012-09-17 47 views
1

我用下面的函數來運行shell命令:我可以指定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

一種方法是在執行之前cd到目錄,因爲腳本將在當前目錄中運行。 – keyser

+0

'(probe-file #P「./」)''? – sbenitezb

+0

(probe-file #P「./」)會在執行shell命令時返回我想要更改的當前目錄。現在我使用腳本來包裝shell命令,然後運行腳本,在其中我可以「cd」到任何指定的目錄。 –

回答

3

在ECL中,您可以在SYSTEM之前使用EXT:CHDIR,它可以同時更改默認路徑名默認值和當前目錄的值,如操作系統和C庫所瞭解的。

BTW:如果可能的話用(EXT:運行程序「命令」列表中,參數),而不是

0

一個更簡便的方式是使用路徑名和動態綁定*default-pathname-defaults*,這將有效地設置你的當前工作目錄。我今天遇到了同樣的問題。下面是從土地Lisp的文本康拉德Barski,指定當前工作目錄的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*))) 

張貼,希望這可能是有用的人在整個運行類似的情況&這個線程。

相關問題