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

Debugging 如何在KSH(非93)下的loaded/exec文件脚本中获取等效LINENO变量内容,debugging,ksh,aix,Debugging,Ksh,Aix,(在KSH下,而不是KSH93)我使用export PS4='+Line:${LINENO}:';在脚本中设置-vx行以进行调试和跟踪 在大多数情况下这已经足够了,但是当脚本加载另一个带有的脚本时,它会“失败”。其他文件。它仍然跟踪,但变量LINENO停留在调用子脚本的行上 是否有办法更改子脚本的此行为(将计数重新启动为0将是完美的) 我试图把这行重新命名为下标,但它没有改变 范例 export PS4='+Line: ${LINENO}: ';set -vx echo "main" echo

(在KSH下,而不是KSH93)我使用
export PS4='+Line:${LINENO}:';在脚本中设置-vx
行以进行调试和跟踪

在大多数情况下这已经足够了,但是当脚本加载另一个带有
的脚本时,它会“失败”。其他文件
。它仍然跟踪,但变量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
...

正如您在问题上的评论和标记所表明的,您运行的是非常旧的ksh版本,例如AIX ksh

如果使用某些版本的ksh93,
$LINENO
会更新。因此,有两种明显的可能性:

  • 为AIX ksh注册错误报告
  • 有一个ksh93的私有版本,你可以在需要时交换
至于ksh93,在
.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进行修改和重新发布。事实上,这些公司(和其他公司)确实做到了这一点,如果你是David Korn,想要全面改进或修复bug,那就留下了一个大问题

这个问题是David Korn试图用ksh93解决的问题之一——恢复对单个代码库的控制,从而修复旧bug并添加新功能

还有一个问题。当谈到
LINENO
时,它表明您所经历的可能是一个bug,但在这里有点模糊,并建议
LINENO
可能是可选的:

LINENO由shell设置为一个十进制数,表示当前序列行号(从1开始编号) 执行每个命令之前的脚本或函数。如果用户未设置 或重置LINENO,则变量可能会失去其对 贝壳的寿命。如果shell当前未执行脚本或 函数,未指定LINENO的值。这卷 POSIX.1-2017仅规定了变量对系统的影响 支持用户可移植性实用程序选项


我知道你要的是行号,不是哪个命令。也许这种方法有帮助:
mycommand_no=1导出PS4='+命令:$((mycommand_no++):';set-vx
。事实上,我也尝试过类似的方法,相当于linux的“调用者”。感谢您的想法正确,即使ksh93经常可用,我的大多数客户仍然使用AIX ksh,而且我必须使用:-(好的。那么我想您应该在问题中指定这一点。然后您的问题变成,“在ksh的AIX版本中,如何解决LINENO在ksh93中的执行方式不一样这一事实”。