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

时间:2018-03-16 09:47:24

标签: debugging ksh aix

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

它在大多数情况下都足够了,但它已经失败了#34;当脚本使用. 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
...

1 个答案:

答案 0 :(得分:1)

正如您的评论和问题标记所示,您运行的是旧版本的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向IBM,HP,DEC和其他公司出售或许可ksh的权利,这些公司允许他们将修改后的代码修改和重新分发为ksh。事实上,这些公司(以及其他公司)确实做到了这一点,如果你是大卫·科恩(David Korn)并且希望全面改进或修复错误,那么就会留下一个大问题。

这个问题是David Korn试图用ksh93解决的问题之一 - 重新控制单个代码库,从而修复旧错误并添加新功能。

然后是POSIX Shell Command Standard。关于LINENO,它表明您所遇到的问题可能是一个错误,但在这里有点模糊,并建议LINENO可能是可选的:

  

LINENO 由shell设置为十进制数,表示当前顺序行号(以1开头编号)   脚本或函数在执行每个命令之前。如果用户取消设置   或者重置LINENO,变量可能会失去其特殊含义   贝壳的生命。如果shell当前没有执行脚本或   函数,LINENO的值未指定。这卷   POSIX.1-2017仅指定变量对系统的影响   支持用户可移植性实用程序选项。