4

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

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 的情况下强制以 comint 模式处理字符串?

4

1 回答 1

4

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

如果您知道您需要的处理比 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"))))

但就您而言,仅使用外壳可能更简单:

(comint-exec (current-buffer) "etl-proxy" 
             "/bin/sh" nil '("-c" "java -cp \"lib/*:src:resources\" clojure.main -m etl-proxy.proxy.core"))
于 2012-11-29T14:02:38.973 回答