2010-06-10 48 views
4

我試圖爲CLISP是這樣工作的與GNU CLISP運行shell命令

(setq result (system "pwd")) 

;;now result is equal to /my/path/here 

創建一個「系統」命令,我有這樣的事情:

(defun system (cmd) 
(ext:run-program :output :stream)) 

但是,我不知道如何將流轉換爲字符串。我已經回顧了hyperspec和谷歌不止幾次。

編輯:用Ranier的指揮工作,並使用與輸出到流,

(defun system (cmd) 
    (with-output-to-string (stream) 
    (ext:run-program cmd :output stream))) 

然後試圖運行grep,這是我的路......

[11]> (system "grep") 

*** - STRING: argument #<OUTPUT STRING-OUTPUT-STREAM> should be a string, a 
     symbol or a character 
The following restarts are available: 
USE-VALUE  :R1  Input a value to be used instead. 
ABORT   :R2  Abort main loop 
Break 1 [12]> :r2 

回答

5

東西喜歡這個?

版本2:

(defun copy-stream (in out) 
    (loop for line = (read-line in nil nil) 
     while line 
     do (write-line line out))) 

(defun system (cmd) 
    (with-open-stream (s1 (ext:run-program cmd :output :stream)) 
    (with-output-to-string (out) 
     (copy-stream s1 out)))) 


[6]> (system "ls") 
"#.emacs# 
Applications 
..." 
+0

問題:什麼是:輸出說明什麼?是一個命名參數的語法? – 2010-06-10 23:41:27

+0

此外,您的建議不起作用,我添加了以上信息 – 2010-06-10 23:47:41

+0

:輸出是一個參數,它設置輸出將指向的位置。在這裏它會被引導到一個流。 – 2011-05-18 04:08:03

3

CLISP documentation on run-program,所述:output參數應該是的

  • :terminal一個 - 寫入到終端
  • :stream - 創建並返回輸入流您可以從中閱讀
  • 一個路徑標誌 - 寫入指定的文件
  • nil - 忽略

如果你正在尋找收集輸出到一個字符串輸出,你將不得不使用讀 - 寫複製循環將數據從返回的流傳輸到一個字符串。根據Rainer的建議,您已經有with-output-to-string在播放,但不是將該輸出流提供給run-program,您需要自己寫信給它,複製輸入流中的數據,由run-program返回。

1

您在具體詢問clisp。如果您使用的是Clozure CL,那麼我會在這裏添加 ,那麼您也可以輕鬆地運行os子進程。

一些例子:

;;; Capture the output of the "uname" program in a lisp string-stream 
;;; and return the generated string (which will contain a trailing 
;;; newline.) 
? (with-output-to-string (stream) 
    (run-program "uname" '("-r") :output stream)) 
;;; Write a string to *STANDARD-OUTPUT*, the hard way. 
? (run-program "cat"() :input (make-string-input-stream "hello") :output t) 
;;; Find out that "ls" doesn't expand wildcards. 
? (run-program "ls" '("*.lisp") :output t) 
;;; Let the shell expand wildcards. 
? (run-program "sh" '("-c" "ls *.lisp") :output t) 

不要在位於這裏的CCL文檔的運行程序的搜索:http://ccl.clozure.com/ccl-documentation.html

有一對夫婦在這個計算器的答案這樣做的很好的Lisp方式:Making a system call that returns the stdout output as a string一旦再次,雷納去救援。感謝Ranier。

0

這是一個較短

(defun system(cmd) 
    (ext:shell (string cmd))) 

> (system '"cd ..; ls -lrt; pwd")