一些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.py
和11 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 11
和22 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"
答案 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'")