Eshell在eshell路径上找不到脚本

时间:2019-03-01 21:07:59

标签: emacs 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路径中了。我相信我这样做是为了使/ opt / bin在运行term命令启动外壳程序时位于我的路径上,这似乎可以正常工作,但不能帮助eshell在此处找到命令。

尝试失败和临时解决方法

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

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路径而不是某些默认目录列表?我应该更新其他路径变量吗?

1 个答案:

答案 0 :(得分:0)

查看eshell/addpath的源,它在setq上使用eshell-path-enveshell/addpath是缓冲区本地变量。这意味着,如果您使用(defun jpk/eshell-mode-hook () (eshell/addpath "/opt/bin")) (add-hook 'eshell-mode-hook #'jpk/eshell-mode-hook) ,则必须在每个eshell缓冲区的上下文中执行它。最好的方法是使用模式挂钩。

eshell-path-env

我对Eshell不太熟悉,所以我不会说这是最好的方法,但是应该可以。 (getenv "PATH")最初是从PATH设置的,因此奇怪的是,设置union env var不起作用(除非您在加载eshell之后执行此操作)。