【发布时间】:2010-06-03 17:56:30
【问题描述】:
基本上,我想生成一个更改其工作目录的进程。 我的想法是生成一个进程并设置 PWD 环境变量。
有没有办法获得类似的东西?
(实际上我想更改任何环境变量以获得灵活性)
【问题讨论】:
基本上,我想生成一个更改其工作目录的进程。 我的想法是生成一个进程并设置 PWD 环境变量。
有没有办法获得类似的东西?
(实际上我想更改任何环境变量以获得灵活性)
【问题讨论】:
在生成进程之前绑定default-directory 变量。示例:
(let ((default-directory "/tmp/"))
(call-process "/bin/bash" nil "*scratch*" nil "-c" "echo working dir is $PWD"))
我从我的 *scratch* 缓冲区运行了这个,字符串 working dir is /tmp 被添加到缓冲区中。
【讨论】:
你的意思是这样吗?
这显示了默认的环境变量:
(shell-command "env")
这显示了如何在每个进程的基础上更改它们:
(shell-command "PWD=/tmp env")
【讨论】:
$PWD 是反映当前工作目录的环境变量,而不是控制它的环境变量。
根据Elisp manual 的Processes 部分,衍生进程的默认目录由default-directory 的值决定。衍生进程的环境与 Emacs 会话的环境相同,您可以使用setenv 进行修改。您还可以通过process-environment 变量指定仅用于衍生进程的环境变量。
【讨论】:
为了让 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 设置为相同的值。
【讨论】: