如何在 AIX 版本的 KSH(非 93)下获取加载/执行文件脚本中的等效 LINENO 变量内容

问题描述 投票:0回答:1

(在 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
...
debugging ksh aix
1个回答
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 并且想要全面改进或修复错误,那么就会留下一个大问题。

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

还有POSIX Shell 命令标准。当谈到

LINENO
时,它表明您遇到的可能是一个错误,但这里有点含糊,并表明
LINENO
可能是可选的:

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

© www.soinside.com 2019 - 2024. All rights reserved.