我可以找到函数定义的位置,但是这对别名不起作用:
$ 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
,它会打印执行的命令行,但它还会在每行前面加上提示符PS4
。PS4
可以配置为显示当前执行的文件和行号。(默认情况下,PS4
显示函数或脚本文件的名称以及当前执行的行号。因此,如果一行代码位于函数内,它不会立即显示其定义位置。)
具体来说,上述命令执行以下操作:
将环境变量设置
PS4
为+%x:%I>
(仅适用于此命令)。%x
替换为包含当前正在运行的源代码的文件的名称。%I
是文件中该代码的行号。+
和>
是修饰,用于区分XTRACE
输出与脚本可能生成的任何输出。笔记:
PS4
如果在配置中某处将其设置为不同的值,则这可能无法正常工作。如果输出不具有所需的格式,则可能需要先删除/注释掉PS4
或PROMPT4
设置。zsh
开始嘚- 启用交互模式(
-i
) - 已
XTRACE
启用 (-x
) - 并仅运行一个空命令行(
-c ''
),然后立即退出。
这意味着,只运行交互模式的初始化文件,并且不会产生提示生成或挂钩命令的混乱。
- 启用交互模式(
|&
是 的简写2>&1 |
,连接标准输出和标准误差 一个命令标准输入下一个。grep subl
搜索“subl”。我建议只查找别名的名称,因为确切的命令行可能不是alias subl="..."
由于解析而产生的。(在嘚alias
您甚至可以通过在关联数组中分配键值对来定义别名,而无需使用命令aliases
:)aliases[subl]="..."