答案 0 :(得分:34)
许多unix变体只允许shebang行上的程序使用单个参数。悲伤,但是真的。如果您使用#!/usr/bin/env emacs
以便不依赖emacs
可执行文件的位置,则根本无法传递参数。
Chaining scripts在某些系统上是可能的,但在任何地方都不支持。
您可以使用历史悠久的编写多语言脚本的途径:一个脚本既是shell脚本又是Emacs Lisp脚本(例如Perl的if $running_under_some_shell
)。它确实看起来很乱,但它确实有效。
Elisp注释以;
开头,它在shell中分隔两个命令。因此我们可以使用;
后跟shell指令切换到Emacs,实际的Lisp代码从下一行开始。大多数shell不喜欢空命令,因此我们需要找到shell和Emacs视为无操作的东西,放在;
之前。 shell no-op命令是:
;就shell而言,你可以把它写成":"
,而Emacs将它解析为顶层的常量,这也是一个无操作。
#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(print (+ 2 2))
答案 1 :(得分:11)
您可以随时将#!/usr/bin/emacs
更改为#!/home/thorsten/bin/emacs-no-site-file
,并将其设置为:
#!/bin/sh
exec /usr/bin/emacs --no-site-file "$@"
如果这对你不起作用,或者你希望你的脚本可以移植,那么请参阅Gilles' answer below以获得更强大(并且有点时髦:)的方法。
答案 2 :(得分:7)
如果您在脚本模式下运行emacs,我建议在脚本结束时将“argv”变量重置为nil,否则emacs将在脚本完成后尝试解释“argv”。
假设您有一个名为“test-emacs-script.el”的文件,其中包含以下内容:
#!/usr/bin/emacs --script
(print argv)
(setq argv nil)
尝试将此脚本作为“./test-emacs-script.el -a”运行。如果您运行此脚本而不重置“argv”(脚本中的最后一行),则输出将为:
("-a")
Unknown option `-a'
重置“argv”会删除“未知选项”错误消息