【问题标题】:zsh -x but don't show the full pathzsh -x 但不显示完整路径
【发布时间】:2021-06-16 11:03:40
【问题描述】:

假设我有一个脚本:

$ cat script.sh
#!/usr/bin/env zsh
myfunc() {
    echo Hello
}
uptime
myfunc

我使用zsh -x $PWD/script.sh 运行它,我得到以下输出:

$ zsh -x $PWD/script.sh
+/Users/username/.zshenv:8> [[ 2 -eq 1 ]]
+/Users/username/so/script.sh:5> uptime
20:12  up 2 days,  1:04, 7 users, load averages: 4.09 3.65 3.42
+/Users/username/so/script.sh:6> myfunc
+myfunc:1> echo Hello
Hello

我宁愿不打印脚本的完整路径,而只使用基本名称,类似于函数名称的显示方式。期望的输出:

$ zsh -x $PWD/script.sh
+.zshenv:8> [[ 2 -eq 1 ]]
+script.sh:5> uptime
20:12  up 2 days,  1:04, 7 users, load averages: 4.09 3.65 3.42
+script.sh:6> myfunc
+myfunc:1> echo Hello
Hello

我知道我可以通过执行例如zsh -x myscript 并没有提供完整路径,但是当它们位于 $PATH 时,许多脚本都是通过它们的完整路径运行的。我经常通过zsh -x =scriptname 调试脚本,其中= 修饰符会导致扩展完整路径。

我是否可以传递任何set 选项、环境变量或其他标志,使zsh -x 仅显示脚本的基本名称?或者任何其他自定义zsh -x 输出的方法都会非常有用。

【问题讨论】:

    标签: shell debugging zsh prompt oh-my-zsh


    【解决方案1】:

    使用zsh -x(也称为选项XTRACE)时打印输出的值从环境变量$PS4 中获取格式说明符。 documentation on ZSH options 声明:

    XTRACE (-x, ksh: -x) 在执行时打印命令及其参数。输出前面是 $PS4 的值,其格式如提示扩展中所述。

    看起来像你的PS4='+%N:%i> '

    有很多提示扩展变量可以使用,可以在Prompt Expansion documentation找到。

    要得到你想要的结果,你需要设置例如:

    $ export PS4="+%1N:%i> "
    # or
    $ export PS4="+%1N:%I> "
    

    前者保持默认的行号行为,但后者显示正在执行的函数的实际行号,我觉得这非常有用。它不会显示myfunc:1,而是显示myfunc:3,因为它是包含myfunc 的文件的第3 行。

    然后输出将如下所示:

    $ zsh -x $PWD/script.sh
    +.zshenv:8> [[ 2 -eq 1 ]]
    +script.sh:5> uptime
    20:25  up 2 days,  1:17, 7 users, load averages: 3.22 3.58 3.49
    +script.sh:6> myfunc
    +myfunc:3> echo Hello
    Hello
    

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 2014-12-09
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多