为什么emacs comint模式不会将字符串作为shell处理?

时间:2012-11-29 07:05:35

标签: shell emacs comint-mode

例如,我有以下命令来运行我的项目:

java -cp "lib/*:src:resources" clojure.main -m etl-proxy.proxy.core

所以我尝试使用以下命令创建comint缓冲区:

(progn 
   (kill-all-local-variables)
   (erase-buffer)
   (comint-mode)
   (comint-exec (current-buffer) "etl-proxy" 
                "java" nil '("-cp" "\"lib/*:src:resources\"" "clojure.main" 
                            "-m" "etl-proxy.proxy.core")))

这将导致java类路径错误。但是当我在属性列表中更改"lib/*:src:resources"键时,这很好。

我如何在没有运行shell的情况下强制执行字符串处理?

1 个答案:

答案 0 :(得分:4)

我认为你所谓的“字符串处理”是通常的shell执行的处理。更好的工具(即按照所有规则执行此操作,例如需要引用的内容,如果$(...)中出现"..."会发生什么,如何展开"foo"*"bar",等......)是贝壳。

如果您知道所需的处理比shell可以做的简单得多,您可以尝试使用特殊情况代码来避免通过shell。 shell.el在一些地方执行此操作并使用shell--unquote-argument,因此您可以尝试使用该功能,如:

(comint-exec (current-buffer) "etl-proxy" 
             "java" nil (mapcar #'shell--unquote-argument
                                '("-cp" "\"lib/*:src:resources\"" "clojure.main" 
                                  "-m" "etl-proxy.proxy.core"))))

但是在你的情况下,使用shell可能更简单:

(comint-exec (current-buffer) "etl-proxy" 
             "/bin/sh" nil '("-c" "java -cp \"lib/*:src:resources\" clojure.main -m etl-proxy.proxy.core"))