Emacs Lisp使用自定义环境变量生成子进程

时间:2010-06-03 17:56:31

标签: linux emacs lisp elisp

基本上我想生成一个更改其工作目录的进程。 我的想法是产生一个过程并设置PWD环境变量。

有办法获得类似的东西吗?

(实际上我想改变任何环境变量的灵活性)

4 个答案:

答案 0 :(得分:2)

你的意思是这样吗?

这显示了默认的环境变量:

(shell-command "env")

这显示了如何在每个进程的基础上更改它们:

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

答案 1 :(得分:2)

在生成进程之前绑定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 :(得分:2)

$PWD是一个环境变量,它反映当前的工作目录,而不是一个控制它的工作目录。

根据ProcessesElisp manual部分,生成进程的默认目录由default-directory的值确定。生成的进程的环境与Emacs会话的环境相同,您可以使用setenv进行修改。您还可以通过process-environment变量指定仅用于生成进程的环境变量。

答案 3 :(得分:2)

为了它的价值,让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-directoryprocess-environment设置为相同的值。