我正在尝试使用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之间有什么变化吗?
答案 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上执行此操作。