查找别名定义的位置


4

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

$ 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。如何找到它而无需手动搜索?


我确实通过运行zsh -v和搜索最终找到了它subl,然后向上阅读直到找到以开头的行source。但是,我希望将来以非手动的方式进行此操作。


Answers:


7

这应该可以解决问题:

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在配置中的某处设置为其他值,则此方法可能无法正常工作。如果输出的格式不符合要求,则可能需要先删除或注释掉PS4PROMPT4设置。

  • zsh启动zsh

    • 启用互动模式(-i
    • XTRACE启用(-x
    • 并且只运行一个空的命令行(-c ''),此后立即退出。

    这意味着,仅运行用于交互方式的初始化文件,并且不会因提示生成或挂钩命令而混乱。

  • |&是的简写2>&1 |,它将标准输出和 一个命令的标准错误连接到下一命令的标准输入
  • grep subl搜索“ subl”。我建议只寻找别名的名称,因为确切的命令行可能不是alias subl="..."由于解析所致。(在zsh的你甚至可以定义一个别名,而无需使用alias由assoziative阵列中分配键-值对命令aliasesaliases[subl]="..."

我也在grepping中alias,以防万一别名在其他上下文中使用。
iconoclast

这个答案非常配得上“超级用户”的称号,谢谢!
lacostenycoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.