问题描述
$ 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