Многие варианты Unix допускают только один аргумент для программы в строке Шебанга. Грустно, но правда. Если вы используете #!/usr/bin/env emacs
, чтобы не зависеть от расположения исполняемого файла emacs
, вы вообще не сможете передать аргумент.
Сценарии цепочки возможна в некоторых системах, но это также не поддерживается везде.
Можно пойти проверенным временем путем написания сценария полиглота: сценария, который является одновременно сценарием оболочки и сценарием Emacs Lisp (например, Perl if $running_under_some_shell
). Это выглядит хакерски, но работает.
Комментарии Elisp начинаются с ;
, который в оболочке разделяет две команды. Таким образом, мы можем использовать ;
с последующей инструкцией оболочки для переключения на Emacs, с фактическим кодом Lisp, начинающимся со следующей строки. Большинству оболочек не нравится пустая команда, поэтому нам нужно найти что-то, что и shell, и Emacs рассматривают как no-op, чтобы поставить перед ;
. Команда shell no-op: :
; вы можете написать это ":"
, что касается оболочки, и Emacs анализирует ее как константу на верхнем уровне, которая также не используется.
#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(print (+ 2 2))