urxvt -e 不提供 .zshrc

Jak*_*ube 2 shell bash zsh terminal path

我想为常见任务创建一个键绑定:打开一个新的终端窗口并ranger在其中打开程序。

显而易见的命令是这样的:

urxvt -e ranger
Run Code Online (Sandbox Code Playgroud)

重要的事情开箱即用。但是在ranger我想使用一个名为 的不同程序时fzf,找不到该程序。错误信息zsh:1: command not found: fzf

结果与

urxvt -e zsh -c ranger
Run Code Online (Sandbox Code Playgroud)

当我已经有一个打开的终端并调用ranger它时,fzf可以毫无问题地调用它。

我看了一下,二进制文件的路径fzf被添加到$PATH我的.zshrc. 所以我的假设是这永远不会来源 my .zshrc,并且它永远不会被添加到路径中。


对此有一个明显的解决方法(使用完整路径fzf在内部调用),但是这个问题已经让我恼火了好几次,我想要一个很好的解决方案。ranger~/.fzf/bin/fzf

我怎样才能打开一个新的终端,源.zshrc并打开程序ranger


还有一个我不明白的观察:

我创建了一个脚本myranger.sh

#!/usr/bin/zsh
source ~/.zshrc
ranger
Run Code Online (Sandbox Code Playgroud)

并使用以下命令创建了新终端:

urxvt -e myranger.sh
Run Code Online (Sandbox Code Playgroud)

带护林员的终端打开,但fzf仍不在$PATH. 我在这里错过了什么?


顺便说一句,这不是zshurxvt具体的。我还使用bash和/或gnome-terminal.

Gil*_*il' 7

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. 从移动路径设置.zshrc.profile原来的位置。