查找别名定义的位置

查找别名定义的位置

我可以找到函数定义的位置,但是这对别名不起作用:

$ type -a subl

subl is an alias for /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl
subl is /Users/brandon/bin/subl

我想知道该别名的定义位置, 不是什么它被定义作为, 或者它指向哪里换句话说:如果我想更改它,要转到哪个文件和行号。我搜索了我的.zshrc以及保存其来源文件的目录,并发现没有什么1.如何才能找到它,而无需手动搜索?


1. 我最终通过运行zsh -v并搜索找到了它subl,然后向上阅读直到找到以 开头的行source。尽管如此,我希望将来能有一种非手动的方式来做到这一点。

答案1

解决方案

这应该可以解决问题:

PS4='+%x:%I>' zsh -i -x -c '' |& grep subl

这应该打印类似的内容

+/Users/brandon/.zshrc.d/aliases.zsh:32>alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'

意思是在文件/Users/brandon/.zshrc.d/aliases.zsh(仅举例)第 32 行alias 'subl=/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'执行了该命令。请注意,显示的命令行是解析文件中写入的命令的结果,因此它们可能不相同。


解释

配置本质上是 shell 命令的列表。命令运行的位置信息通常仅在命令实际运行时可用。命令完成后,环境或 shell 设置中的任何更改可能会保留,但这些更改如何发生的信息会消失。因此,搜索配置文件或在运行时跟踪信息是唯一的选择。

搜索配置文件 - 正如您所注意到的 - 容易出错,因为很容易忽略一些配置文件;在启动交互式 shell 时直接加载最多八个不同的配置文件,并且可以从那里获取任意数量的附加文件。

这是哪里zsh 的 XTRACE( -x) 开始发挥作用。与VERBOSE( -v)类似XTRACE,它会打印执行的命令行,但它还会在每行前面加上提示符PS4PS4可以配置为显示当前执行的文件和行号。(默认情况下,PS4显示函数或脚本文件的名称以及当前执行的行号。因此,如果一行代码位于函数内,它不会立即显示其定义位置。)

具体来说,上述命令执行以下操作:

  • 将环境变量设置PS4+%x:%I>(仅适用于此命令)。%x替换为包含当前正在运行的源代码的文件的名称。%I是文件中该代码的行号。+>是修饰,用于区分XTRACE输出与脚本可能生成的任何输出。

    笔记:PS4如果在配置中某处将其设置为不同的值,则这可能无法正常工作。如果输出不具有所需的格式,则可能需要先删除/注释掉PS4PROMPT4设置。

  • zsh开始

    • 启用交互模式(-i
    • XTRACE启用 ( -x)
    • 并仅运行一个空命令行(-c ''),然后立即退出。

    这意味着,只运行交互模式的初始化文件,并且不会产生提示生成或挂钩命令的混乱。

  • |&是 的简写2>&1 |,连接标准输出标准误差 一个命令标准输入下一个。
  • grep subl搜索“subl”。我建议只查找别名的名称,因为确切的命令行可能不是alias subl="..."由于解析而产生的。(在alias您甚至可以通过在关联数组中分配键值对来定义别名,而无需使用命令aliases:)aliases[subl]="..."

相关内容