从Common Lisp执行shell命令

Erh*_*mir 23 lisp bash shell common-lisp exec

如何在Common Lisp程序中执行shell(bash)命令并将输出分配给变量?

Ter*_*aug 12

ASDF提供了RUN-SHELL-COMMAND许多Common Lisp实现,包括ABCL,Allegro CL,CLISP,Clozure CL,ECL,GCL,LispWorks,SBCL,CMU,XCL和SCL.

它接受一个控制字符串和一个参数列表FORMAT,并使用兼容Bourne的shell同步执行结果.通过绑定可选流来捕获输出.

  • 如果它被弃用了,那还有什么选择呢? (6认同)
  • 请记住,从[ASDF文档](http://common-lisp.net/project/asdf/asdf.html)获取`run-shell-command`:"此函数已过时且仅出于向后兼容性:"如果它没有倒退,它就不兼容了."我们强烈反对它的使用.它目前的行为只在Unix平台(包括MacOS X和cygwin)上得到很好的定义.在Windows上,任何事情都有.下面的文档仅仅是为了以一种保留语义的方式迁移它." (5认同)
  • 根据文档,run-program比run-shell-command更受欢迎 (4认同)
  • 你可以找到`run-program`文档[这里](https://common-lisp.net/project/asdf/asdf.html#index-run_002dprogram)和简单的用法示例[here](http:// stackoverflow. COM /问题/ 7721081 /不,还有,存在标准的路到运行外部程序合共口齿不清). (2认同)

tho*_*odg 12

ITA已根据其QITAB伞式项目发布了劣质外壳.

一些可能感兴趣的链接:

git存储库目前在common-lisp.net上托管:

git clone git://common-lisp.net/projects/qitab/inferior-shell.git
Run Code Online (Sandbox Code Playgroud)

  • 除了git repo之外,`:inferior-shell`可以通过[`quicklisp`](http://www.quicklisp.org/beta/)安装. (5认同)

小智 8

你可以考虑使用Trivial-shell(url)

(trivial-shell:shell-command "echo foo")
Run Code Online (Sandbox Code Playgroud)

shell-command返回输出,因此您可以将其分配给变量.

asdf.lisp文件中,您可以阅读:

;;;; 我们可能应该将此功能移至其自己的系统并弃用

;;;; 从asdf包中使用它.但是,这将打破未指定

;;;; 现有软件,所以在存在明确的替代方案之前,我们不能弃用

;;;; 它,即使在它被弃用之后,我们也会支持它

;;;; 年,所以每个人都有时间远离它. - 票价2009-12-01

  • 根据[Cliki上的普通shell页面](http://www.cliki.net/trivial-shell):"NB:这些天你可能更喜欢劣质外壳,因为它具有更广泛的支持和更丰富的界面." (2认同)

Mic*_* E. 6

现在我会使用uiop:run-program,uiop代表"通用输入输出",是asdf3提供的兼容层,以前称为asdf/driver.正如已经说过asdf:run-shell-command的那样,uiop继承了其他库的许多功能,例如trivial-shell.

UIOP自述文件


小智 6

在 sbcl 中:

(sb-ext:run-program "/bin/sh" (list "-c" "whoami") :input nil :output *standard-output*)
Run Code Online (Sandbox Code Playgroud)

这对我来说可以:)


Mar*_*ars 5

一些CL实现具有用于此目的的内置函数.例如,SBCL有sb-ext:run-program,而CCL有run-program.