Skrypty powłoki Emacs-jak umieścić początkowe opcje w skrypcie?

Zainspirowany pytaniem o przepełnienie stosu Idomatic przetwarzanie wsadowe tekstu w Emacsie? wypróbowałem skrypt powłoki Emacsa z następującym nagłówkiem:

#!/usr/bin/emacs --script 

Umieściłem w nim kod Emacs Lisp i zapisałem go jako textfile rcat.

Ponieważ opcja -- script nie uniemożliwia wczytywania pliku site-start, miałem dużo

Loading /etc/emacs/site-start.d/20apel.el (source)...
Loading /etc/emacs23/site-start.d/35elib-startup.el (source)...
Loading /etc/emacs23/site-start.d/50auctex.el (source)...

Wiadomości w powłoce Bash (stdout). Mogę temu zapobiec, dzwoniąc

rcat --no-site-file

Lub

rcat -Q

Ale nie zmieniając nagłówek w scenariuszu:

 #!/usr/bin/emacs --script --no-site-file

Czy jest sposób, aby przekazać dodatkowe opcje do Emacsa w takim pliku skryptu zamiast robić to później w wierszu poleceń?

Author: Community, 2011-06-04

3 answers

Zawsze możesz zmienić #!/usr/bin/emacs na coś podobnego #!/home/thorsten/bin/emacs-no-site-file i ustawić to jako:

#!/bin/sh
exec /usr/bin/emacs --no-site-file "$@"

Jeśli to nie działa dla Ciebie lub jeśli chcesz, aby twój skrypt był przenośny, zobacz odpowiedź Gillesa poniżej dla bardziej solidnego (i nieco funky :) podejścia.

 11
Author: phils,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:52:59

Wiele wariantów Uniksa pozwala programowi tylko na jeden argument w linii shebang. Smutne, ale prawdziwe. Jeśli używasz #!/usr/bin/env emacs, aby nie zależeć od lokalizacji pliku wykonywalnego emacs, nie możesz przekazać argumentu w ogóle.

Skrypty łańcuchowe są możliwe w niektórych systemach, ale nie wszędzie jest to obsługiwane.

Możesz przejść zaszczytną drogę pisania skryptu polyglot: skryptu, który jest zarówno skryptem powłoki, jak i skryptem Emacs Lisp (jak Perl if $running_under_some_shell, na przykład). Wygląda na oklepane, ale działa.

Komentarze Elisp zaczynają się od ;, które w powłoce oddziela dwa polecenia. Możemy więc użyć ;, po której następuje Instrukcja powłoki, aby przełączyć się na Emacsa, a rzeczywisty kod Lispu zaczyna się w następnej linii. Większość powłok nie lubi jednak pustych poleceń, więc musimy znaleźć coś, co zarówno powłoka, jak i Emacs traktują jako no-op, aby umieścić przed ;. Komenda shell no-op to :; można ją zapisać ":" jeśli chodzi o powłokę, Emacs przetwarza ją jako stałą na najwyższym poziomie, która jest również no-op.

#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(print (+ 2 2))
 34
Author: Gilles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:02

Jeśli uruchamiasz Emacsa w trybie skryptowym, polecam zresetować zmienną " argv "do zera na końcu skryptu, w przeciwnym razie emacs spróbuje zinterpretować" argv " po zakończeniu skryptu.

Załóżmy, że masz plik o nazwie "test-emacs-script.el " o następującej treści:

#!/usr/bin/emacs --script
(print argv)
(setq argv nil)

Spróbuj uruchomić ten skrypt jako "./ test-Emacs-script.el-a". Jeśli uruchomisz ten skrypt bez resetowania "argv" (ostatnia linia w skrypcie), to wyjście będzie:

("-a")
Unknown option `-a'

Resetowanie "argv" otrzymuje usunięcie Komunikatu o błędzie "Nieznana opcja"

 7
Author: Jurijs Oniscuks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-14 14:49:59