解
这应该可以解决问题:
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'
已执行。请注意,显示的命令行是解析文件中写入的命令的结果,因此它们可能并不相同。
说明
zsh的配置实质上是Shell命令的列表。通常仅在命令实际运行时才提供运行命令的位置的信息。命令完成后,环境或外壳程序设置中的任何更改都可能保留,但是这些更改如何实现的信息就消失了。因此,在运行时搜索配置文件或跟踪信息是唯一的选择。
正如您所注意到的那样,搜索配置文件容易出错,因为很容易忽略某些配置文件。启动交互式Shell时,zsh最多直接加载八个不同的配置文件,并且可以从那里获取任意数量的其他文件。
这就是zsh XTRACE
(-x
)起作用的地方。与VERBOSE
(-v
)类似,它会XTRACE
打印已执行的命令行,但也要在每行之前加上PS4
提示。PS4
可以配置为显示当前执行的文件和行号。(默认情况下PS4
显示函数或脚本文件的名称以及当前执行的行的编号。因此,如果代码行位于函数内部,则不会立即显示其定义位置。)
详细地,以上命令执行以下操作:
将环境变量设置PS4
为+%x:%I>
(仅对于此命令)。%x
被包含当前正在运行的源代码的文件名替换。%I
是文件中该代码的行号。+
并且>
进行修饰以区分XTRACE
输出与脚本可能生成的任何输出。
注意:如果PS4
在配置中的某处设置为其他值,则此方法可能无法正常工作。如果输出的格式不符合要求,则可能需要先删除或注释掉PS4
或PROMPT4
设置。
zsh
启动zsh
- 启用互动模式(
-i
)
- 与
XTRACE
启用(-x
)
- 并且只运行一个空的命令行(
-c ''
),此后立即退出。
这意味着,仅运行用于交互方式的初始化文件,并且不会因提示生成或挂钩命令而混乱。
|&
是的简写2>&1 |
,它将标准输出和 一个命令的标准错误连接到下一命令的标准输入。
grep subl
搜索“ subl”。我建议只寻找别名的名称,因为确切的命令行可能不是alias subl="..."
由于解析所致。(在zsh的你甚至可以定义一个别名,而无需使用alias
由assoziative阵列中分配键-值对命令aliases
:aliases[subl]="..."
)