首页 > 解决方案 > Eshell 在 eshell 路径上找不到脚本

问题描述

我的目标

我正在尝试将“/opt/bin”添加到 eshell 用于查找脚本的路径列表中。到目前为止,我已经尝试通过三种方式做到这一点

迄今为止的尝试

1) (setenv "PATH" (concat "/opt/bin:" (getenv "PATH")))

2) (eshell/addpath "/opt/bin:")

3) (添加到列表 'exec-path "/opt/bin")

第一次尝试确实将“/opt/bin”添加到 eshell 的路径中(它在下面调用“which lein”的输出中显示为“/opt/bin:”的第一个实例)

第二次尝试还将“/opt/bin”添加到 eshell 的路径(它在下面调用“which lein”的输出中显示为“/opt/bin:”的第二个实例)

实际上,我已经将“/opt/bin”添加到我的 exec-path 有一段时间了。我相信我这样做是为了 /opt/bin 在运行 term 命令以启动 shell 时会出现在我的路径上,这似乎工作正常,但无助于 eshell 在那里找到命令。

失败的尝试和临时解决方法

您可以在下面的 eshell 输出中看到,即使命令 lein 在 eshell 识别 eshell 找不到该命令的路径上可用。但是,如果我从 eshells 默认路径中的目录创建符号链接到 /opt/bin 中的脚本,那么 eshell 就可以找到它。

外壳输出

~ $ which lein
which: no lein in (/opt/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin:/usr/sbin:/sbin:/opt/bin:)
~ $ l /opt/bin/ | grep lein
-rwxr-xr-x   1 kevin          kevin    12538 2019-01-17 07:32 lein
~ $ sudo ln -s /opt/bin/lein /usr/local/bin/lein
[sudo] password for kevin: 
~ $ 
~ $ which lein
/usr/local/bin/lein

我宁愿不必在 /usr/local/bin/ 中创建符号链接,以便 eshell 可以在我的 /opt/bin 中找到脚本。请注意,即使在重新启动 emacs 后,它也会在 /opt/bin 中找到符号链接而不是脚本。这发生在 linux mint debian (v9.3) 版本上的 emacs-25 的 GUI 实例中。

问题:

如何让 eshell 实际检查 eshell 路径而不是一些默认的目录列表?我应该更新不同的路径变量吗?

标签: emacseshell

解决方案


Looking at the source of eshell/addpath, it uses setq on eshell-path-env, which is a buffer local var. This means that if you use eshell/addpath, it has to be executed in the context of each eshell buffer. The best way to do this is to use a mode hook.

(defun jpk/eshell-mode-hook ()
  (eshell/addpath "/opt/bin"))
(add-hook 'eshell-mode-hook #'jpk/eshell-mode-hook)

I'm not super familiar with Eshell, so I'm not going to say this is the best way, but it should work. eshell-path-env is set from (getenv "PATH") initially, so it's weird that setting PATH env var doesn't work (unless you're doing that after loading eshell).


推荐阅读