emacs - 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 路径而不是一些默认的目录列表?我应该更新不同的路径变量吗?
解决方案
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).
推荐阅读
- reactjs - React - 如何生成动态表单
- javascript - 如何正确观察 Vuex 中的状态变化?
- tensorflow - Google Cloud ML Engine:超参数调优无法加载 TensorFlow 后端
- linux - 为什么linux上不可读的ELF可以运行?
- android - 在 Android KitKat 及更高版本上阅读传入短信
- python - 在另一个数据系列python中获取具有值的数据系列
- pandas - 导入 Dask 数据框会出现错误 cannot import name 'is_datetime64tz_dtype'
- c# - 为每个循环添加 1 个额外的字符到字符串
- python - 引用csv文件python中的列
- java - Java 新手并不断出现语法错误