2

为什么第一个摘录成功而第二个摘录失败?

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 执行代码。)

4

1 回答 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细节可能有点偏离。

于 2013-08-01T23:32:27.237 回答