Emacs Lisp порождает подпроцессы с пользовательскими переменными среды - PullRequest
3 голосов
/ 03 июня 2010

По сути, я хочу порождать процесс, меняя свой рабочий каталог. Моя идея состояла в том, чтобы создать процесс и установить переменную среды PWD.

Есть способ получить что-то подобное?

(фактически я хотел бы изменить любую из переменных среды для гибкости)

Ответы [ 4 ]

2 голосов
/ 18 декабря 2013

Для чего стоит, чтобы подпроцессы python вели себя так, как я хотел (очевидно, полностью полагая, что они находятся в указанном каталоге), мне пришлось сделать:

(let* ((default-directory (find-correct-dir))
       (process-environment (cons (format "PWD=%s" default-directory)
                                  process-environment)))
  (do-the-subprocess-thing))

Или, если бы я хотел выбросить остальную часть окружающей среды:

(let* ((default-directory (find-correct-dir))
       (process-environment (list (format "PWD=%s" default-directory))))
  (do-the-subprocess-thing))

То есть мне нужно было установить и default-directory и process-environment, и на одно и то же значение.

2 голосов
/ 03 июня 2010

Просто свяжите переменную default-directory перед тем, как запустить процесс. Пример:

(let ((default-directory "/tmp/"))
  (call-process "/bin/bash" nil "*scratch*" nil "-c" "echo working dir is $PWD"))

Я запустил это из моего *scratch* буфера, и в буфер была добавлена ​​строка working dir is /tmp.

2 голосов
/ 03 июня 2010

$PWD - это переменная среды, которая отражает текущий рабочий каталог, а не тот, который управляет им.

Согласно разделу Процессы руководства Elisp , каталог по умолчанию для порожденного процесса определяется значением default-directory . Среда порожденного процесса такая же, как и в сеансе Emacs, который вы можете изменить с помощью setenv . Вы также можете указать переменные среды, которые используются исключительно для порожденных процессов, через переменную process-environment .

2 голосов
/ 03 июня 2010

Вы имеете в виду, как это?

Показывает переменные среды по умолчанию:

(shell-command "env")

и это показывает, как вы можете изменить их для каждого отдельного процесса:

(shell-command "PWD=/tmp env")
...