我在使用带参数的run-program时遇到问题。 http://www.clisp.org/impnotes/shell.html的文档对于像我这样的新手来说非常不完整,我需要看一些例子。
特别是,如何使用" txt"获取文件的目录列表?扩展
这有效:
(ext:run-program "ls" ) ; I am running on Mac OS X
但是如果我添加参数,它就不起作用了。我试过了:
(ext:run-program "ls" :arguments "*.txt")
(ext:run-program "ls" :arguments '(*.txt))
(ext:run-program "ls *.txt)
任何人都可以告诉我正确的语法,并希望提供更多run-program
的例子吗?
请注意,上面只是一个例子。我想要的是能够使用run-command,而不是列出目录,我可以用list-directory。
感谢您的帮助。
答案 0 :(得分:3)
首先,如果你想要的只是列出文件,你可以使用标准
directory
或CLISP特定的ext:dir
。
其次,"*"
globbing由 shell 扩展,而不是单独的命令,所以你需要使用
ext:run-shell-command
而不是ext:run-program
:
> (ext:run-shell-command "ls *.txt")
foo.txt
> (ext:run-program "ls" :arguments '("foo.txt"))
foo.txt
> (ext:run-program "ls")
foo.txt
bar.c
本手册假定您对现代操作系统在这方面的工作方式有一定程度的了解。另一个优秀的答案详细解决了这些问题;简要地:
run-program
使用标准fork
/ exec
范例执行另一个程序run-shell-command
通过shell,所以你可以使用globbing和类似循环的东西shell
主要用于交互式使用您可以在CLISP test suite中找到run-program
的更多示例。
如果您想从压缩文件中读取,可以执行this:
;; return lines as a list
(with-input-from-file (in (ext:make-pipe-input-stream "gunzip -c myfile.gz"))
(loop for l = (read-line in nil nil)
while l
collect l))
实际上,你可以use CLISP as your shell!
答案 1 :(得分:1)
尝试类似
的内容(ext:run-program "stat" :arguments '("/tmp" "/sys"))
我在这个例子中使用的是stat
,而不是ls
。
您可能想要的是globbing(阅读glob(7))。你应该在Lisp中自己做,或者运行/bin/sh -c
;换句话说,您需要构建在:arguments
之后传递的展开的列表。 (你不能将*.txt
作为单个参数传递,它与引用的shell参数具有相同的效果,如在ls '*.txt'
shell命令中一样)
这不是CLISP特有的。 ext:run-program
可能forking然后调用(在孩子中)execve(2),因此您必须自己进行全局操作。
也许您希望CLISP等效于glob(3)或fnmatch(3)。如果它有或没有CLISP,我就不会知道。
阅读Advanced Linux Programming以更清楚地了解这一情况。在POSIX系统上,调用进程(在键入命令时通常是shell,或者如果使用ext:run-program
....则需要使用Common Lisp程序)必须扩展并构建参数列表。关键是,当您运行ls *.txt
时,正在展开ls
的是您的shell(而非*.txt
进程),因此ls
正在进行扩展参数列表,例如a.txt foo.txt bar.txt
;所以你需要在你的Lisp代码中做同样的事情。