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,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 输出方法都会非常有用。

解决方法

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

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

看起来像您的 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...