shell - 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
都会非常有用。
解决方案
使用时打印出的值zsh -x
(也称为选项XTRACE
)从环境变量中获取格式说明符$PS4
。ZSH 选项的文档指出:
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
推荐阅读
- javascript - 为什么 mapStateToProps 函数中的状态总是“未定义”?
- mysql - docker mysql - 用户访问被拒绝
- javascript - 为什么我不能使用地图功能?
- oauth-2.0 - 使用 oauth Google Drive 访问以前创建的文件夹
- python - Python Tkinter 按钮 - 分别对齐/锚定文本/标签和图标
- c# - c# float to int cast返回错误值
- r - 在另一个 RMarkdown 文件中嵌入使用 markdown 语法编写的文本文件
- javascript - 从数组内的多个范围中提取值
- python - 如何使用 Flask 设置 Pusher 服务器?
- excel - Excel Power Query 仅导入列标题,不导入数据