43.17 批处理模式

命令行选项 ‘-batch’ 使 Emacs 以非交互方式运行。在此模式下,Emacs 不从终端读取命令、不修改终端模式,也不向可刷新屏幕输出内容。其设计用途是执行指定的 Lisp 程序,程序运行完毕后 Emacs 自动退出。指定待运行程序的方式包括:‘-l file’ 加载名为 file 的库、‘-f function’ 无参调用 function,或 ‘--eval=form’ 执行表达式。

Variable: noninteractive

当 Emacs 运行在批处理模式时,该变量的值为非 nil

若批处理模式下指定的 Lisp 程序触发未捕获的错误,Emacs 会先调用 Lisp 调试器在标准错误流中输出 Lisp 回溯信息(see 调用调试器),随后以非零退出码退出:

$ emacs -Q --batch --eval '(error "foo")'; echo $?

Error: error ("foo")
mapbacktrace(#f(compiled-function (evald func args flags) #<bytecode -0x4f85c5
7c45e2f81>))
debug-early-backtrace()
debug-early(error (error "foo"))
signal(error ("foo"))
error("foo")
eval((error "foo") t)
command-line-1(("--eval" "(error \"foo\")"))
command-line()
normal-top-level()
foo
255

通常会输出到回显区的 Lisp 程序输出(包括 message、以 t 为流的 prin1 等,see 输出流),在批处理模式下会转向 Emacs 的标准描述符:message 写入标准错误,而 prin1 等打印函数写入标准输出。同理,通常来自小缓冲区的输入会从标准输入读取。因此 Emacs 行为与普通非交互程序一致。(Emacs 自身产生的回显区输出,如命令回显,会被完全屏蔽。)

写入标准输出或错误流的非 ASCII 文本,在 locale-coding-system 非空时默认使用其编码(see 区域设置);可通过将 coding-system-for-write 绑定到指定编码系统来覆盖该行为(see 显式编码与解码)。

批处理模式下,Emacs 会将变量 gc-cons-percentage 的值从默认 ‘0.1’ 提升至 ‘1.0’。需要长时间运行的批处理任务应将该限制调低,因为默认设置会减少垃圾回收次数(并占用更多内存)