例如,我有以下命令来运行我的项目:
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的情况下强制执行字符串处理?
答案 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"))