代码之家  ›  专栏  ›  技术社区  ›  Paul Nathan

使用gnu clisp运行shell命令

  •  4
  • Paul Nathan  · 技术社区  · 14 年前

    我正在尝试为clisp创建一个“system”命令,它的工作方式是这样的

    (setq result (system "pwd"))
    
    ;;now result is equal to /my/path/here
    

    我有这样的东西:

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

    但是,我不知道如何将流转换为字符串。我已经多次回顾了Hyperspec和Google。

    编辑:使用ranier的命令并使用with output to stream,

    (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
    
    4 回复  |  直到 10 年前
        1
  •  5
  •   Rainer Joswig Michael Fox    14 年前

    像这样?

    版本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
    ..."
    
        2
  •  3
  •   seh Alexei    14 年前

    每个 CLISP documentation on run-program , the :output 参数应为

    • :terminal -写入终端
    • :stream - 创造 返回一个 输入流 从中你可以阅读
    • 路径名指示符 -写入指定文件
    • nil -忽略输出

    如果要将输出收集到字符串中,则必须使用读写复制循环将数据从返回流传输到字符串。你已经有了 with-output-to-string 在游戏中,根据雷纳的建议,但不是提供输出流 运行程序 ,您需要自己写,从 输入流 返回的 运行程序 .

        3
  •  2
  •   Community holdenweb    7 年前

    你具体问的是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文档中搜索run程序: http://ccl.clozure.com/ccl-documentation.html

    在这个stackoverflow答案中有两种很好的lisp方法: Making a system call that returns the stdout output as a string 再次,雷纳去营救。谢谢Ranier。

        4
  •  0
  •   e19293001    10 年前

    这是短一点的

    (defun system(cmd)
      (ext:shell (string cmd)))
    
    > (system '"cd ..; ls -lrt; pwd")