【问题标题】:which shell-command in emacs lisp?emacs lisp中的哪个shell命令?
【发布时间】:2010-11-30 01:13:03
【问题描述】:

如果我尝试在 Emacs Lisp 函数中运行 shell 命令,在该函数中我多次调用 rsync(或 scp),我应该使用哪个 shell 命令变体?我目前正在使用shell-command,它会锁定Emacs,直到进程完成,并且不会打印--verbosersync 应该可见的输出;我可以在命令字符串的末尾使用shell-command& 使其异步,这确实打印了进度——但是虽然它没有完全“锁定”Emacs,但迷你缓冲区反复询问我是否想要杀死同时瘫痪的进程;和start-process-shell-command,它似乎仅在传输第一个文件/目录后才停止该功能;当通过我的函数进行多个rsync 调用时,忽略其余部分。这些似乎都不理想,有什么提示吗?

【问题讨论】:

标签: emacs elisp


【解决方案1】:

我自己使用 start-process 取得了最大的成功。

(start-process "process-name" 
               (get-buffer-create "*rsync-buffer*") 
               "/path/to/rsync"
               arg1
               ...
               argn)

这会将所有输出发送到单个缓冲区。

【讨论】:

    【解决方案2】:

    一种解决方案可能是在实际的shell buffer 中运行命令。然后你可以选择运行哪一个:

    M-x shell
    M-x eshell
    M-x term
    

    如果你喜欢这个想法,你可以这样编码:

    (defun my-rsync-routine ()
      "run some rsync processes"
      (with-temp-buffer
        (shell (current-buffer))
        (process-send-string nil "rsync ...")
        (process-send-string nil "rsync ...")
        (process-send-string nil "rsync ...")))
    

    阅读更多关于'process-send-string 的用法。您可能还希望从进程中对output 进行一些错误检查。

    【讨论】:

    • 你好 Trey,谢谢你。这次我不得不选择 Jonathan 的解决方案,但因为它是直接的并且非常适合这个目的(并且 process-send-string 似乎只在创建和明确引用的缓冲区中工作(使用 get-buffer-create)而不是在temp-buffer ...)但我正在阅读过滤功能...有很多东西需要了解,我相信我会在它结束时找到用途。再次感谢您。
    最近更新 更多