首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在KSH (非93)下获取加载/exec文件脚本中等价的LINENO变量内容

如何在KSH (非93)下获取加载/exec文件脚本中等价的LINENO变量内容
EN

Stack Overflow用户
提问于 2018-03-16 17:47:24
回答 1查看 227关注 0票数 -1

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

在大多数情况下,这已经足够了,但是当脚本使用. OtherFile加载另一个脚本时,它会“失败”。它仍然跟踪,但变量LINENO停留在调用子脚本的行上。

有没有一种方法可以改变子脚本的这种行为(重新开始计数到0会很完美)

我试着将行重新放到下标中,但它没有改变。

示例

代码语言:javascript
复制
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行

代码语言:javascript
复制
...
+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
...
EN

回答 1

Stack Overflow用户

发布于 2018-06-09 22:24:34

正如您的评论和问题上的标记所暗示的那样,您运行的是非常旧的ksh版本,例如AIX ksh。

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

  • 为AIX注册一个错误报告ksh
  • 有一个私有版本的ksh93,您可以在需要时将其替换为

至于ksh93,在.sh结构化变量中还有其他变量,比如.sh.file

下面是一个示例:

代码语言:javascript
复制
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“,而不是许多”KSH“:如果有一种神奇的方法可以在其中一个中完成此任务,那么它将适用于您的AIX ksh.l。所以让我详细说明..。

AT&T将ksh的权利出售或授权给IBM、HP、DEC和其他公司,这些公司反过来允许他们修改和重新分发修改后的代码作为ksh。事实上,这些公司(和其他公司)确实做到了这一点,如果你是David Korn,并且想要全面改进或修复bug,那么就会留下一个很大的问题。

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

然后是POSIX Shell Command Standard。当涉及到LINENO时,它表明您所经历的可能是一个错误,但这里有点含糊,并表明LINENO可能是可选的:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49317548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档