Zsh 函数用于检查重复的 PATH 条目和被遮挡的可执行文件

Zsh 函数用于检查重复的 PATH 条目和被遮挡的可执行文件

这在许多系统上都会发生,我希望有人能找到解决方案。

PATH 环境变量是安全问题的主要部分。为了合理起见,路径部分如下.zshrc所示:

# Set Path
PATH_RUBY="/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3..0/bin"
PATH_TREESITTER="$HOME/p/na/ts/tree_sitter_na/node_modules/.bin"
PATH_CONDA="/usr/local/anaconda3/bin"
PATH_CARGO=".cargo/bin"
PATH_TEX="/usr/texbin:/opt/X11/bin"
PATH_HOME="$HOME/bin:$HOME"
PATH_OSX="/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library
/Apple/usr/bin"
export PATH="$PATH_RUBY:$PATH_CONDA:$PATH_TREESITTER:$PATH_CARGO:$PATH_TEX:$PATH_HOME:$PATH_OSX"

虽然我可以检查路径混合以确保路径中没有重复的完整目录,但是否有人编写了冲突列表函数?我试图防止某些未经检查的工具安装,例如TreeSitter拥有自己的ssh命令,该命令将代替后者执行/usr/bin/ssh。此工具既可以增加安全性,也可以解决安装不当的问题。

也就是说,我想要一个像这样的工具:

$ checkpath
.../p/na/tree_sitter_na/node_modules/.bin/ssh occudes /usr/bin/ssh
$

答案1

在 中zshtype -a将列出 中所有出现的命令PATH。列表中的第一个是“活动”匹配:

> type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
> cp /bin/ls ~/bin
> type -a ls
ls is /bin/ls
ls is /Users/gairfowl/bin

更多信息这里


有一些非常有用的功能可以zsh帮助操纵路径。使用“绑定”变量,可以通过标PATH量或path数组引用可执行搜索路径:

> print $PATH
/usr/bin:/bin
> path+=/sbin
> print $PATH
/usr/bin:/bin:/sbin
> print -l $path
/usr/bin
/bin
/sbin

PATHpath默认设置为此方式。其他变量可以配置为绑定变量,例如typeset -T LD_LIBRARY_PATH ld_library_path

-U可以使用选项来typeset设置变量,使它们不包含重复项:

> print $PATH
/usr/bin:/bin
> path+=/sbin
> path+=/sbin
> print $PATH
/usr/bin:/bin:/sbin:/sbin
> typeset -U PATH path
> print $PATH
/usr/bin:/bin:/sbin

您可能还想看看:a 扩展修饰符从相对路径获取绝对路径。

相关内容