debugging 如何在AIX版本的KSH(非93)下的loaded/exec文件脚本中获取等效的LINENO变量内容

1mrurvl1  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(133)

(在KSH下,而不是KSH93)我使用脚本中的export PS4='+Line: ${LINENO}: ';set -vx行进行调试和跟踪。
这在大多数情况下是足够的,但当脚本加载另一个带有. OtherFile的脚本时,它会“失败”。它仍然跟踪,但变量LINENO停留在调用子脚本的行上。
有没有办法改变这种行为的子脚本(重新启动计数为0,这将是完美的)
我试着把这一行重新放到下标中,但它没有改变。
例如

export PS4='+Line: ${LINENO}: ';set -vx
echo "main"
echo "echo 'slave 1'" > /tmp/slave.txt
echo "echo 'slave 2'" >> /tmp/slave.txt
. /tmp/slave.txt

返回卡在线路5上

...
+Line: 4: echo echo 'slave 2'
+Line: 4: 1>> /tmp/slave.txt
. /tmp/slave.txt
+Line: 5: . /tmp/slave.txt
+Line: 5: echo slave 1
slave 1
+Line: 5: echo slave 2
slave 2
...
4bbkushb

4bbkushb1#

正如您的评论和问题上的标签所示,您运行的是一个非常旧的ksh版本,例如AIX ksh。
如果你使用ksh 93的某个版本,$LINENO会更新。所以有两种明显的可能性:

  • 注册AIX ksh的错误报告
  • 我有一个ksh 93的私有版本,你可以在需要的时候换用它

对于ksh 93,在.sh结构化变量中还有其他变量,如.sh.file
下面是一个示例:

export PS4='file ${.sh.file}, line $LINENO '
$ ksh -x /etc/profile
file /etc/profile, line 4 [ $'$? $(printf %(%H:%M:%S)T) ${USER}@$(hostname):${PWD} [$SHLVL,${.sh.subshell},k] \n\\$ ' ]
file /etc/profile, line 5 [ '' ]
file /etc/profile, line 12 id -u
file /etc/profile, line 12 [ 1000 -eq 0 ]
file /etc/profile, line 15 PS1='$ '
file /etc/profile, line 20 [ -d /etc/profile.d ]
file /etc/profile, line 22 [ -r /etc/profile.d/appmenu-qt5.sh ]
file /etc/profile, line 23 . /etc/profile.d/appmenu-qt5.sh
file /etc/profile.d/appmenu-qt5.sh, line 1 QT_QPA_PLATFORMTHEME=appmenu-qt5
file /etc/profile.d/appmenu-qt5.sh, line 1 export QT_QPA_PLATFORMTHEME
file /etc/profile, line 22 [ -r /etc/profile.d/apps-bin-path.sh ]
file /etc/profile, line 23 . /etc/profile.d/apps-bin-path.sh
fi

您似乎在暗示只有 * 一个 *“KSH”而不是很多:如果有一种神奇的方法可以在其中一个中完成此操作,那么它将适用于您的AIX ksh. l。
AT&T将ksh的权利出售或授权给IBM、HP、DEC和其他公司,允许他们反过来修改和重新分发修改后的代码作为ksh。事实上,这些公司(和其他公司)确实这样做了,如果你是大卫科恩,想要全面改进或修复bug,那就有一个大问题了。
这个问题是大卫科恩试图用ksh 93解决的问题之一--重新获得对单个代码库的控制权,从而可以修复旧的bug并添加新的功能。
然后是POSIX Shell Command Standard。当涉及到LINENO时,它建议您遇到的可能是一个bug,但这里有点模糊,并建议LINENO可能是可选的:

LINENO由shell设置为表示当前顺序行号的十进制数(编号从1开始)在脚本或函数执行每个命令之前。如果用户取消或重置LINENO,则变量可能在shell的生命周期中失去其特殊意义。如果shell当前未执行脚本或函数,LINENO的值是未指定的。POSIX.1-2017的本卷仅为支持User Portability Utilities选项的系统指定了该变量的效果。

相关问题