我想为常见任务创建一个键绑定:打开一个新的终端窗口并打开ranger
其中的程序。
显而易见的命令是这样的:
urxvt -e ranger
重要的事情开箱即用。但在ranger
我想使用另一个名为 的程序时fzf
,找不到该程序。错误信息zsh:1: command not found: fzf
。
结果与
urxvt -e zsh -c ranger
当我已经有一个打开的终端并调用ranger
它时,fzf
就可以毫无问题地调用。
我看了一下,二进制文件的路径fzf
被添加到$PATH
我的.zshrc
.所以我的假设是,这永远不会来源 my .zshrc
,并且它永远不会添加到路径中。
对于这个问题有一个明显的解决方案(使用完整路径调用fzf
内部),但是这个问题已经让我烦恼了好几次了,我想要一个好的解决方案。ranger
~/.fzf/bin/fzf
如何打开一个新终端来获取.zshrc
并打开程序ranger
?
还有一个我不明白的观察:
我创建了一个脚本myranger.sh
:
#!/usr/bin/zsh
source ~/.zshrc
ranger
并使用以下命令创建新终端:
urxvt -e myranger.sh
带有 Ranger 的终端打开,但fzf
仍然不在 中$PATH
。我在这里错过了什么?
顺便说一句,这不是zsh
或urxvt
具体的。我还用bash
和/或对此进行了测试gnome-terminal
。
答案1
urxvt -e zsh -c ranger
几乎相当于urxvt -e ranger
.您告诉 urxvt 运行 zsh,然后 zsh 运行 ranger,仅此而已。urxvt -e zsh -c ranger
不加载.zshrc
:zsh 仅在启动时加载它交互的shell,即读取用户命令的 shell,而不是在启动运行脚本的 shell 时(无论该脚本是在文件中,还是通过命令行传递-c
)。
您可以.zshrc
显式加载(urxvt -e zsh -c '. ~/.zshrc; ranger'
或者像您一样使用包装器脚本)。但这不是一个好主意,因为.zshrc
它用于 zsh 的交互式设置 - 键绑定、别名等。环境变量设置(例如 PATH)适用于所有程序,因此应该在登录时完成,通常在~/.profile
。将您的 PATH 设置移至.zshrc
其.profile
所属位置。
答案2
引用zsh
手册:
召唤
-i 强制 shell 交互。
然后
如果 shell 是登录 shell,则从 读取命令
/etc/zprofile
,然后读取命令$ZDOTDIR/.zprofile
。然后,如果 shell 是交互式的,则从/etc/zshrc
和 then 读取命令$ZDOTDIR/.zshrc
。最后,如果shell是登录shell,/etc/zlogin
则$ZDOTDIR/.zlogin
读取。...
如果
ZDOTDIR
未设置,HOME
则使用它。
因此,要.zshrc
在开始运行时强制采购
urxvt -e zsh -ci ranger