将参数传递给cmdproxy上的call-process

时间:2013-06-27 16:59:17

标签: windows shell emacs cmd escaping

一些Emacs包(例如AUCTeX)通过以下方式将用户指定的shell命令传递给shell:

(call-process shell-file-name nil 0 nil shell-command-switch the-user-specified-command)

在MS Windows的情况下通常相当于:

(call-process "cmdproxy" nil 0 nil "-c" the-user-specified-command)

如果我想传递这个shell命令,我应该如何转义字符:

"print arg.py" "11 11" "22 22"

使用两个参数print arg.py11 11运行脚本(其基本名称为22 22的空格)?

在以下调用中,cmdproxy只是说Unable to initialize device PRN

(call-process "cmdproxy"
              nil "foo" nil
              "-c"
              "\"print arg.py\" \"11 11\" \"22 22\"")

对于以下来电,它会显示error: no program name specified.

(call-process "cmdproxy"
              nil "foo" nil
              "-c"
              "\"\"print arg.py\"\" \"\"11 11\"\" \"\"22 22\"\"")

对于以下内容,它说'\"print arg.py\"' is not recognized as an internal or external command, operable program or batch file.

(call-process "cmdproxy"
              nil "foo" nil
              "-c"
              "\\\"print arg.py\\\" \\\"11 11\\\" \\\"22 22\\\"")

另一方面,以下调用成功运行带有参数11 1122 22的脚本。

(setenv "ABC" "\"print arg.py\" \"11 11\" \"22 22\"")
(call-process "cmdproxy"
              nil "foo" nil
              "-c"
              "%ABC%")

这可能是一个很好的解决方法,但它没有说明如何转义字符。

脚本文件print arg.py的内容,适用于想要测试的人:

import sys

if __name__ == "__main__":
    print "start"
    for arg in sys.argv[1:]:
        print "(" + arg + ")"
    print "end"

2 个答案:

答案 0 :(得分:0)

您似乎不需要shell:只需执行(call-process "print arg.py" nil "foo" nil "11 11" "22 22")

答案 1 :(得分:0)

使用反斜杠转义命令名称中的空格并将参数放入单引号:

(call-process "cmdproxy"
          nil "foo" nil
          "-c"
          "print\ arg.py '11 11' '22 22'")