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"、プロパティリストのキーを変更すると、これは正常に機能します。

シェルを実行せずにcomintモードで文字列処理を強制するにはどうすればよいですか?

4

1 に答える 1

4

「文字列処理」と呼ばれるものは、通常のシェルが行う処理だと思います。$(...)それを行うためのより良いツール (つまり、何を引用する必要があるか、 aが 内に表示された場合に何が起こるか、"..."を展開する方法など、すべての規則に従って行うため"foo"*"bar") はシェルです。

必要な処理がシェルで実行できるものよりもはるかに単純であることがわかっている場合は、特殊なケースのコードを試して使用して、シェルを経由しないようにすることができます。 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 に答える