shebang emacs --script作为bash运行

时间:2014-02-22 16:41:38

标签: macos bash shell emacs

我正在尝试使用Emacs Lisp作为备用shell脚本语言,但遇到了一个奇怪的问题。我在一个名为hello.el的文件中编写了以下Emacs Lisp脚本,然后使其可执行:

#!/usr/local/bin/emacs --script
(princ "hello world\n")

当我跑步时,我得到以下内容:

$ ./hello.el
./hello.el: line 2: princ: command not found

经过一些实验,我发现#!下面的代码是由Bash运行的,或者至少是其他一些shell,而不是Emacs:

#!/usr/local/bin/emacs --script
foo=bash?
echo $foo
ls -l | sort | tail -1

$ ./hello.el
bash?
total 7984

这对我来说似乎很奇怪,因为在各种Emacs文档中有很多对这个--script选项的引用,当我使用它直接运行脚本时它工作正常(即当我粘贴{{1}时进入我的终端。

真正奇怪的是,这个脚本完全符合预期:

/usr/local/bin/emacs --script hello.el

但我使用#!/usr/bin/emacs --script (princ "hello world\n") 的原因是它是一个较新的版本; /usr/local/bin/emacs的版本是Apple提供的Mac OS X附带的Emacs,而/usr/bin/emacs中的版本是通过brew安装的,而且是更近期的(Emacs 24 vs 22)。

这里出了什么问题? Emacs 22和24之间有什么变化吗?

1 个答案:

答案 0 :(得分:4)

所以我写了这个问题并且在了解问题之前得到了关于Mac OS X的一点,并且认为我可能会在这里发布答案,因为它有点神秘。希望它有所帮助。

问题是/usr/local/bin/emacs是一个符号链接,指向的不是Emacs二进制文件,而是指向shell脚本:

$ ls -l /usr/local/bin/emacs
lrwxr-xr-x  1 aki  staff  30 May 20  2013 /usr/local/bin/emacs -> ../Cellar/emacs/24.3/bin/emacs
$ file /usr/local/Cellar/emacs/24.3/bin/emacs
/usr/local/Cellar/emacs/24.3/bin/emacs: Bourne-Again shell script text executable
$ cat /usr/local/Cellar/emacs/24.3/bin/emacs
#!/bin/bash
/usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs -nw  "$@"

我不知道为什么#!/path/to/a/shell/script无法“做正确的事”。我尝试了它,它似乎只是将你的第一个脚本作为shell脚本运行,而不是将脚本的名称作为参数传递给第一个脚本,正如你所期望的那样。也许有些shell精灵会对此发表评论吗?

与此同时,这有效:

#!/usr/local/Cellar/emacs/24.3/bin/emacs-24.3 --script
(princ "hello world\n")

因为这是正确的Emacs二进制文件的路径。我想你会想要用env或其他任何东西做一些废话来使这个便携。

希望这有助于其他人尝试在Mac上执行此操作。