Can';t在elisp中将字符串作为shell命令执行

Can';t在elisp中将字符串作为shell命令执行,shell,emacs,elisp,Shell,Emacs,Elisp,执行top表单时会出现错误“C:\Documents”无法识别为内部或外部命令、可操作程序或批处理文件。。执行第二个表单放入*Messages*缓冲区的输出会按预期工作(创建标记文件) 为什么两种技术的效果都不一样?shell命令是否在将字符串发送到shell之前更改字符串?如何使用elisp执行字符串,就像将其粘贴到命令提示符中一样 shell quote参数也不起作用,因为它生成的字符串不能用以下任一方法执行: (shell-command "\"C:\\Documents and Sett

执行top表单时会出现错误
“C:\Documents”无法识别为内部或外部命令、可操作程序或批处理文件。
。执行第二个表单放入
*Messages*
缓冲区的输出会按预期工作(创建标记文件)

为什么两种技术的效果都不一样?
shell命令
是否在将字符串发送到shell之前更改字符串?如何使用elisp执行字符串,就像将其粘贴到命令提示符中一样


shell quote参数
也不起作用,因为它生成的字符串不能用以下任一方法执行:

(shell-command "\"C:\\Documents and Settings\\ggustafson\\Desktop\\stuff\\ctags58\\ctags.exe\" -eR -f \"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\\TAGS\" \"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\"")

(message "\"C:\\Documents and Settings\\ggustafson\\Desktop\\stuff\\ctags58\\ctags.exe\" -eR -f \"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\\TAGS\" \"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\"")

我建议您双重检查这两个执行是否使用相同的路径,因此是否使用相同的
ctags.exe
。我想这可能就是问题所在。您可能需要使用
ctags.exe的完整路径来确保这一点


如果我在普通shell上使用
-Re
选项,我的ctags(Linux)会给我同样的错误;这就是我的想法。

我建议您仔细检查这两个执行是否使用相同的路径,因此是否使用相同的
ctags.exe
。我想这可能就是问题所在。您可能需要使用
ctags.exe的完整路径来确保这一点


如果我在普通shell上使用
-Re
选项,我的ctags(Linux)会给我同样的错误;这就是我的想法。

shell quote argument
用于将单个参数引用到shell命令(因此得名),而不是整个shell命令

考虑到您看到的错误表明某个地方缺少引用,使用内置命令处理引用似乎是一个好主意,而不是手动编写并假设您有正确的语法


另一种选择是使用M-!要以交互方式执行命令(或类似命令),请确定接受的是什么,然后使用C-xM-:获取elisp表单。

shell quote argument
用于将单个参数引用到shell命令(因此得名),而不是整个shell命令

考虑到您看到的错误表明某个地方缺少引用,使用内置命令处理引用似乎是一个好主意,而不是手动编写并假设您有正确的语法



另一种选择是使用M-!要以交互方式执行命令(或类似的命令),请找出接受的内容,然后使用C-xM-:获取elisp表单。

我强烈建议您在此处使用
调用程序
而不是
shell命令
,因为您不使用shell的任何功能,而且它只是碍事,强迫你引用体操来向shell解释你的意思。

我强烈建议你在这里使用
调用程序
,而不是
shell命令
,因为你不使用shell的任何功能,而且它只会碍事,强迫你引用体操向shell解释你的意思。

你可能使用不同版本的
ctags.exe
。你能尝试使用完整路径吗?查找
C-h f shell quote参数
@slitvinov我一直在使用完整路径,所以看来这是emacs的问题,而不是CTAG的问题。编辑了问题以澄清这一点。@phils我有,请看问题,但我看不出它如何解决我的问题。您可能使用了不同版本的
ctags.exe
。你能尝试使用完整路径吗?查找
C-h f shell quote参数
@slitvinov我一直在使用完整路径,所以看来这是emacs的问题,而不是CTAG的问题。编辑问题以澄清这一点。@phils我有,请看问题,但我看不出它如何解决我的问题。在两次测试中,我与
ctags.exe
位于同一目录中。编辑问题以更好地澄清问题的来源。:)答案解决了您提出的原始问题(在编辑问题之前)。我认为你遇到的问题可能与。。。shell命令使用的shell与手动粘贴命令的shell是否相同?我不确定您是否可以在Windows中使用
(shell命令“echo$0”)
进行验证。我一直在使用
shell
命令生成的缓冲区从emacs中执行这些命令。我相信该命令和
shell命令
都在使用emac的cmdproxy.exe,但我正在寻找一种方法进行双重检查。在两次测试中,我与
ctags.exe
位于同一目录中。编辑问题以更好地澄清问题的来源。:)答案解决了您提出的原始问题(在编辑问题之前)。我认为你遇到的问题可能与。。。shell命令使用的shell与手动粘贴命令的shell是否相同?我不确定您是否可以在Windows中使用
(shell命令“echo$0”)
进行验证。我一直在使用
shell
命令生成的缓冲区从emacs中执行这些命令。我相信该命令和
shell命令
都在使用emac的cmdproxy.exe,但我正在寻找一种方法来双重检查。+1用于使用
C-x m-:
获取最后一个命令的elisp表单。出于某种原因,我需要离开,而不是整条路。这是在不同的机器上工作的:
(消息“c:\\Users\\Username\\Desktop\\\”ctags 58\\\ctags.exe-f\'c:\\Users\\Username\\Desktop\\TAGS\\”\“c:\\Users\\Username\\Desktop\\ctags 58\\”)
+1,用于使用
c-x M-:
获取最后一个命令的elisp格式。出于某种原因,我需要离开,而不是整条路。这是在另一台计算机上工作的内容:
(消息“c:\\Users\\Username\\Desktop\\\”ctags 58\\\ctags.exe-f\'c:\\Users\\Username\\Desktop\\TAGS\\\”c:\\Users\\Username\\Desktop\
(message (shell-quote-argument "\"C:\\Documents and Settings\\ggustafson\\Desktop\\stuff\\ctags58\\ctags.exe\" -eR -f \"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\\TAGS\" \"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\""))
"^\"\\^\"C:\\Documents and Settings\\ggustafson\\Desktop\\stuff\\ctags58\\ctags.exe\\^\" -eR -f \\^\"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\\TAGS\\^\" \\^\"C:\\Documents and Settings\\ggustafson\\Desktop\\BlueTooth_7020\\^\"^\""