很是蛋疼,exec-path-from-shell提供的默认arguement 是-l -i,但是zsh -l -i -c 'echo $PATH'
并不从.zshenv读取环境变量,然而官方默认却说要写在.zshenv里面...zsh -i -c 'echo $PATH'
倒是能读取到zshenv,但是.zshrc 的也一并读取了...求教解决方案:sweat_smile:
(use-package exec-path-from-shell
:defer t
:init
(setq exec-path-from-shell-check-startup-files nil) ;; only from .zshenv
(setq exec-path-from-shell-arguments '("-l")) ;; remove -i read form .zshenv
(setq exec-path-from-shell-variables '("PATH"))
(exec-path-from-shell-initialize))
这是参考论坛某个帖子的,据我观察,每次启动并不读.zshrc
其实让他读.zshrc启动时间也没有差多少,我觉得主要是package-initialize太慢了
你没有用 export PATH=$PATH:xxxx
吧?
我在.zshenv里面添加了
export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
terminal中执行
$ zsh -l -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
也就是使用login shell并不会读取.zshenv,很奇怪,官方文档明明写了大多zsh都会run.A User's Guide to the Z-Shell
实际测试下来,只有interactive shellzsh -i -c 'echo $PATH'
才会load .zshenv中定义的path...
你在 zshrc 或者别的地方覆盖了吗……
我的问题跟这个一样...就是使用login shell会在run .zshenv后会调用/etc/zsh/profile,然后path就被覆盖了. https://bbs.archlinux.org/viewtopic.php?id=180845
升级了10.15之后貌似没有继承了?
我还没升级 macOS,不过我没依赖 Mac Port 的这个特性,而是自己手动设置的
;; [[https://emacs-china.org/t/topic/5507][Mac 下给 Emacs 设置 PATH 和 exec-path - Emacs-general - Emacs China]]
;; NOTE: When PATH is changed, run the following command
;; $ sh -c 'printf "%s" "$PATH"' > .path
(when *is-mac*
(condition-case err
(let ((path (with-temp-buffer
(insert-file-contents-literally "~/.path")
(buffer-string))))
(setenv "PATH" path)
(setq exec-path (append (parse-colon-path path) (list exec-directory))))
(error (warn "%s" (error-message-string err)))))
这样完全不用运行个 Shell 来获得 PATH。
我用的也是类似手动储存PATH和其他几个环境变量到一个文件里,Emacs再导入的方法。之前尝试改变launchd的环境变量但没有作用:launchd的变量是改变了,但是从spotlight/dock开启的Emacs并没有继承这些环境变量,不知道是什么问题。 忘了这么打开Emacs不是从launchd继承环境变量,我回去重启spotlight再试试 重启了也不行。
我所有环境设置都在~/.profile
里,然后再在其他shell的配置文件里source ~/.profile
。这样只用维护一份环境配置,所有shell都能用。
写:
echo "(setenv \"PATH\" \"$PATH\") (setenv \"CPATH\" \"$CPATH\") (setenv \"MANPATH\" \"$MANPATH\")" > ~/.emacsenv
读:
(defun luna-load-env ()
"Load PATH and CPATH from a file."
(interactive)
(condition-case err
(progn (load "~/.emacsenv")
(setq exec-path (split-string (getenv "PATH") ":")))
(error (message (error-message-string err)))))