我需要在Emacs中使用我的$PATH
来运行一些命令。如何让Emacs使用它?我从Ubuntu存储库安装了Emacs。
答案 0 :(得分:36)
这是一个技巧I use,以确保我的GUI Emacs始终看到我在shell中获得的$PATH
:
(defun set-exec-path-from-shell-PATH ()
(let ((path-from-shell (replace-regexp-in-string
"[ \t\n]*$"
""
(shell-command-to-string "$SHELL --login -i -c 'echo $PATH'"))))
(setenv "PATH" path-from-shell)
(setq eshell-path-env path-from-shell) ; for eshell users
(setq exec-path (split-string path-from-shell path-separator))))
(when window-system (set-exec-path-from-shell-PATH))
具体来说,在OS X上,图形化的Emacs不会获取用户shell的$PATH
定义,所以这个技巧可以帮助我在那个平台上。
更新:此代码现已发布为名为exec-path-from-shell的elisp库,MELPA中提供了可安装的软件包。
答案 1 :(得分:9)
https://stackoverflow.com/a/12229404/1190077中给出了一个更通用的解决方案(设置所有变量和别名,而不仅仅是PATH
) - 关键是要设置:
(setq shell-command-switch "-ic")
覆盖默认的"-c"
(执行以下命令)。添加"-i"
会强制bash shell进入交互模式,从而导致~/.bashrc
的来源。
答案 2 :(得分:1)
如果你的env vars没有被选中,可能是因为emacs的启动方式。检查menuitem或其他内容,然后尝试将emacs
更改为bash -c emacs
。
答案 3 :(得分:1)
您可以将路径设置添加到/etc/profile.d,例如
# /etc/profile.d/path.sh
export PATH="$PATH:/usr/local"
在Ubuntu中,我记得所有会话来源~/.xsessionrc
,因此您也可以在此文件中为GUI应用程序设置路径。
答案 4 :(得分:1)
我想出了类似的东西来寻找我的.bash_profile。如果你只关心PATH,那么上面的其他答案之一就更简单了。
它的工作原理是执行source ~/.bash_profile ; echo post-env; env
然后在" post-env"之前丢弃所有内容,然后解析" key = value"中的值。格式化" env"命令打印。
它可能无法完美地处理每一个案例,但对我来说效果还不错。
;;-------------------------------------------------------
;; begin sourcing of .bash_profile
;; only do this on Mac OS X
(when (string= system-type "darwin")
;; require common lisp extensions, for search
(require 'cl)
(defun src-shell-unescape (string)
;; replace \n \t \r \b \a \v \\
;; and octal escapes of the form \0nn
(replace-regexp-in-string
"\\\\\\([ntrbav]\\|\\(\\\\\\)\\|\\(0[0-7][0-7]\\)\\)"
(lambda (str)
;; interpret octal expressions
;; of the form "\0nn"
(let ((char1 (aref str 1)))
(cond ((= ?0 (aref str 1))
(byte-to-string
(+ (* (- (aref str 2) ?0) 8)
(- (aref str 3) ?0))))
((eq char1 ?n) "\n")
((eq char1 ?t) "\t")
((eq char1 ?r) "\r")
((eq char1 ?b) "\b")
((eq char1 ?a) "\a")
((eq char1 ?v) "\v")
((eq char1 ?\\) "\\\\")
(t "")))) string))
(defun src-set-environment-from-env-output(env-output)
;; set the environment from shell's "env" output
(let ((lines (split-string env-output "\n" t)))
(dolist (line lines)
(let ((idx-equals (search "=" line)))
(when (and (not (eq idx-equals nil))
(> idx-equals 1))
(let ((key (substring line 0 idx-equals))
(value (substring line (+ idx-equals 1))))
(setenv key (src-shell-unescape value))
;; (message "%s = %s" key value)
))))))
(defun src-source-shell-file (file-name)
;; if your shell is sh rather than bash, the "source " may need
;; to be ". " instead
(let* ((command (concat "source '" file-name "'; echo 'post-env'; env"))
(output (shell-command-to-string command))
(idx-post-env (search "post-env" output)))
(if (eq nil idx-post-env)
(message "Didn't find expected output after sourcing %s. Found: %s" file-name output)
(let ((trimmed-output (substring output idx-post-env)))
;; (message "trimmed-output: %s" trimmed-output)
(src-set-environment-from-env-output trimmed-output)))))
(src-source-shell-file (expand-file-name "~/.bash_profile")))
;; end sourcing of .bash_profile
;;-------------------------------------------------------
答案 5 :(得分:0)
如果在您启动emacs的终端中设置了$PATH
,则可以通过命令M-! <your command> RET
执行系统命令。
答案 6 :(得分:0)
有许多Emacs软件包可以更新$ PATH环境变量和'exec-path'。这是因为Emacs不在与BASH相关的文件中假设定义,例如'〜/ .bashrc'。
在未从终端外壳执行的任何程序中需要具有的所有定义,都必须移至“〜/ .profile”,这些定义会在系统启动时加载。
某些旧系统需要从'/ etc / profile'手动加载用户个人资料。