为什么第一个摘录成功而第二个摘录失败?
system 'emacs', '--batch', '--quick', '--eval="(require \'package)"'
system 'emacs --batch --quick --eval="(require \'package)"'
(如果重要的话,我在 Mac OS X Mountain Lion 上使用 Ruby 版本 1.8.7 和 Emacs 版本 22.1.1 执行代码。)
为什么第一个摘录成功而第二个摘录失败?
system 'emacs', '--batch', '--quick', '--eval="(require \'package)"'
system 'emacs --batch --quick --eval="(require \'package)"'
(如果重要的话,我在 Mac OS X Mountain Lion 上使用 Ruby 版本 1.8.7 和 Emacs 版本 22.1.1 执行代码。)
首先,这两个system
调用的不同之处可能出乎您的意料。一个简单的例子可能比一堆单词和挥手更好地解释差异。从一个简单的 shell 脚本开始:
#!/bin/sh
echo $1
我会这样称呼它,pancakes.sh
因为我更喜欢煎饼而不是 foo。然后我们可以走进irb
去看看发生了什么:
>> system('./pancakes.sh --where-is="house?"')
--where-is=house?
>> system('./pancakes.sh', '--where-is="house?"')
--where-is="house?"
你看到显着的区别了吗?单参数形式system
将整个字符串交给/bin/sh
处理,/bin/sh
并将以自己的方式处理双引号,因此被调用的程序永远不会看到它们。的多参数形式system
不会调用/bin/sh
来处理命令行,因此参数按原样传递,双引号完好无损。
回到你的system
电话。第一个会将这个确切的参数发送到emacs
(请注意,Ruby 将负责转换\'
为 just '
):
--eval="(require 'package)"
并将emacs
尝试评估"(require 'package)"
;对我来说,它看起来更像是一个字符串而不是一个 elisp 片段,并且评估一个字符串文字并没有做任何事情。您的第二个会将其发送到emacs
:
--eval=(require 'package)
并且emacs
会抱怨它
无法打开加载文件:包
请注意,我的 elisp 知识被埋没在大约 20 年的生锈和健忘之下,所以一些emacs
细节可能有点偏离。