2010-07-29 54 views
4

我試圖直接從xemacs運行P4V命令。 在p4.el拉後Emacs的,我寫了以下內容:emacs lisp shell進程參數問題

(defun p4v-command (cmd) 
    (get-buffer-create p4-output-buffer-name);; We do these two lines 
    (kill-buffer p4-output-buffer-name)  ;; to ensure no duplicates 
    (call-process "p4v" nil (get-buffer-create p4-output-buffer-name) nil 
       "-p" (p4-get-p4-port) 
       "-u" "UserName" 
       "-c" (p4-current-client) 
       "-cmd" (shell-quote-argument (concat cmd " " (buffer-name)))) 
    (display-buffer p4-output-buffer-name)) 

我試圖得到shell命令如下(在CMD等於prevdiff):

p4v -p port -u user -c client -cmd "prevdiff file.txt" 

然而,當我prevdiff執行上面的功能我得到以下錯誤

P4V: unrecognized argument '"prevdiff' for '-cmd' option. 

如此看來,呼叫過程分裂引號的字符串「prevdiff file.txt的」成個別參數和P4V只處理第一個參數。

這似乎並沒有發生,因爲我已經與呼叫進程試圖所以我不知道其他命令,如果它是一個口齒不清的問題或者是與P4V。

有誰知道如何解決這個問題?

+0

我無法重現你準確看到的內容,但是你確定需要'(shell-quote-argument ...)'嗎?看起來'call-process'直接將參數傳遞給進程,而不使用shell。如果你不試圖引用這個論點,會發生什麼? – 2010-07-29 06:30:56

+0

謝謝邁克。我想我確實需要它。它將引號插入到字符串中,因此您將得到一個帶有「\」prevdiff file.txt \「」的字符串。這意味着當傳遞給shell命令時,該字符串會用引號括起來。 – sickgemini 2010-07-29 21:44:43

回答

4

調用過程絕對不會連接它的參數;它直接傳遞給程序。看到這種情況,類型M-:和評估下面的表達式:

(call-process "/bin/ls" nil "*scratch*" nil "avg ba") 

,其中「平均」和「BA」在當前目錄下的文件。我碰到下面的信息插入到我劃傷緩衝:

/bin/ls: cannot access avg ba: No such file or directory 

如果調用進程已經重新分析的參數,它會分裂「平均巴」分爲兩個獨立的參數---但錯誤信息表明它沒有。

相反,問題在於shell引用參數。當我評價你在提通話劃傷緩衝,我得到如下:

(shell-quote-argument "prevdiff file.txt") 
"prevdiff\\ file.txt" 

換句話說,命令P4V實際收到是你的shell作爲輸入什麼:

p4v -p port -u user -c client -cmd '"prevdiff file.txt"' 

這就是爲什麼P4V抱怨「prevdiff

所以我想你想的卻是:

"-cmd" (concat cmd " " (shell-quote-argument (buffer-name)))) 

(但請檢查我的parens,當然)。

+0

謝謝吉姆!工作過一種享受。 – sickgemini 2010-07-30 03:59:24

+0

這是不正確的:當你得到''prevdiff \\ file.text「',然後將它傳遞給'call-process'時,引號不會被髮送到進程(它們是elisp字符串的一部分語法,而不是字符串的一部分)。我認爲發生的事情是,@Jim Blandy和我在unixy系統上,而@Jeremy Simon在Windows上,其中'shell-quote-argument'將返回'「\」prevdiff file.txt \「」'。這將解釋'p4v'錯誤。 – 2010-07-30 08:19:30

+0

是的,邁克,你說得對。我誤解了* scratch *緩衝區中的內容。傑里米,我很高興我的錯誤和操作系統的差異取消了! – 2010-07-30 16:56:32