【问题标题】:Emacs Lisp spawning subprocesses with custom environmental variablesEmacs Lisp 使用自定义环境变量生成子进程
【发布时间】:2010-06-03 17:56:30
【问题描述】:

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

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

(实际上我想更改任何环境变量以获得灵活性)

【问题讨论】:

    标签: linux emacs lisp elisp


    【解决方案1】:

    在生成进程之前绑定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】:

      你的意思是这样吗?

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

      (shell-command "env")
      

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          为了让 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 设置为相同的值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-30
            • 1970-01-01
            • 2018-07-09
            • 2014-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多