1

次の関数を使用してシェル コマンドを実行します。

(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 ライブラリで認識されるように、default-pathname-defaultsと現在のディレクトリの値の両方が変更されます。

ところで:可能であれば、代わりに (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 に答える