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ń?
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.
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))
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"
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