2012-08-13 61 views
0

我有一系列的系统调用使用此语法:emacs的打印命令输出

(call-process "/bin/sh" nil nil t "-c" command) 

其中command是shell命令。我想知道当我在commands.el文件中有这些系统调用时是否有打印输出的方法,我用emacs --script commands.el来调用它。目前,这些命令被执行,但是所有输出似乎都被捕获并且不被打印。

+0

输出通常被收集在当前的缓冲区,但您指定要把它抛弃通过传递'nil'作为第三个参数。您也可以通过此参数指定不同的缓冲区。 – tripleee 2012-08-13 09:27:00

+0

我是否必须将其捕获到临时缓冲区中,然后打印缓冲区?我尝试了't'作为第三个参数,但它也没有打印出来(不知道当作为脚本运行时,“当前缓冲区”是什么)。 – hatmatrix 2012-08-13 10:12:41

+0

这听起来像是一个可行的解决方案,是的。如果你的会话在任何时候都没有设置缓冲区,我猜测当前的缓冲区最终会成为'* scratch *'缓冲区。 (更新:已确认。)其中包含一些注释,因此最好在开始时创建一个新的空缓冲区。 – tripleee 2012-08-13 10:52:25

回答

1

它可能更容易让emacs的为您管理的临时缓冲区:

(defun run-it (cmd) 
    "run CMD in shell and return result as string." 
    (with-temp-buffer 
    (call-process "/bin/sh" nil t t "-c" cmd) 
    (buffer-string))) 
+1

如果你想像这样运行一个shell命令,只需使用现有的函数shell-command-to-string即可。代码几乎相同(在simple.el中查找),但自动使用正确的shell等。 – 2012-08-16 10:22:33

1

这样的事情呢?

(set-buffer (get-buffer-create " output")) 
(mapc (function (lambda (cmd) (call-process "/bin/sh" nil t t "-c" cmd))) 
    '("echo hello" 
    "perl -e \"die qq(goodbye)\"")) 
(message "%s" (buffer-string)) 

在输出结束时输出at -e line 1.。也许在它之前添加一个空行,或找出一个方法来压制它。