首页 > 解决方案 > zsh -x 但不显示完整路径

问题描述

假设我有一个脚本:

$ 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都会非常有用。

标签: shelldebuggingzshpromptoh-my-zsh

解决方案


使用时打印出的值zsh -x(也称为选项XTRACE)从环境变量中获取格式说明符$PS4ZSH 选项的文档指出:

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

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

您可以使用许多提示扩展变量,您可以在提示扩展文档中找到它们。

要获得您想要的结果,您需要设置例如:

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

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

输出将如下所示:

$ 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

推荐阅读