我的目标
我正在尝试将“ / 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路径而不是某些默认目录列表?我应该更新其他路径变量吗?
答案 0 :(得分:0)
查看eshell/addpath
的源,它在setq
上使用eshell-path-env
,eshell/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之后执行此操作)。