【问题标题】:How to show the line number in Shell (/bin/sh) script when debugging (-x)?调试(-x)时如何在Shell(/bin/sh)脚本中显示行号?
【发布时间】:2019-04-01 15:22:54
【问题描述】:

我正在使用#!/bin/sh -x 调试 DASH SHELL 中的脚本,我想在调试时显示脚本行号。

已经尝试更改 PS4 变量(如 this answer 所示),但没有成功,因为它只适用于 bash,我需要 shell。

PS4='Line ${LINENO}: '

我希望得到以下输出:

123: + echo test

但是$LINENO在shell中什么都没有。

我使用的是 ubuntu 16.04 x64 和 dash 版本 0.5.8-2.1ubuntu2 500

具体来说,我正在尝试调试 Virtualbox 配置文件以在 linux 上构建它。 以下是脚本的一些部分以及我是如何尝试的。

 #!/bin/sh -x
PS4='Line ${LINENO}: '
LC_ALL=C
export LC_ALL

# append some extra paths
PATH="$PATH:/opt/gnome/bin"
# Solaris (order of paths important for tr, grep, sed to work)
PATH="/usr/xpg4/bin:$PATH:/usr/local/bin:/usr/sfw/bin:/usr/ccs/bin"
ORGPATH=$PATH
...
    echo "  disabled hardening!"
    echo "  +++ WARNING +++ WARNING +++ WARNING +++ WARNING +++ WARNING +++ WARNING +++"
    echo ""
fi
echo "Enjoy!"
cleanup

结果是:

Line : [ 1 -ne 0 ]
Line : test -z nofatal
Line : echo
Line : echo
Line : return 1

【问题讨论】:

  • LINENOPS4 POSIX 指定的功能,尽管是可选的(仅在实现标准的用户可移植实用程序附件的 shell 中需要)。你能指定你正在测试的/bin/sh的具体实现吗?
  • ...嗯?我上面评论的全部要点是,包含交互式使用选项/bin/sh 实现已经需要支持LINENOPS4,所以这个问题实际上没有意义,除非你将其缩小到可以观察到不起作用的特定实现。
  • 如果您展示了您的测试方式也会很有帮助。您是想通过环境传入PS4,还是将其设置在脚本本身中?
  • ..."in shell" 并不是一个真正有用的描述;有很多个贝壳。 /bin/sh 是现代系统上的 POSIX sh-compliant shell,但我们要说任何有用的东西,我们需要知道 哪个 POSIX-compliant shell -- 供应商,版本,发布。
  • 也就是说,鉴于您脚本中的/usr/xpg4/bin 引用,这是一个SunOS 机器吗?这可以解释很多:/bin/sh 在 SunOS 上完全符合 POSIX 标准;除非你使用/usr/xpg4/bin/sh,否则它就在那里 Bourne(但是你如何在一个太旧的系统上运行 VirtualBox,甚至无法拥有符合 POSIX 标准的/bin/sh)?

标签: linux shell unix sh


【解决方案1】:

此处讨论的所有功能都已在 POSIX 标准的用户可移植性实用程序附件中有所要求。

此外,dash,Linux 上最常见的非 bash /bin/sh 实现,已经具有内置功能,您可以在下面进行测试:

dash -s <<'EOF'
PS4=':$LINENO+'; set -x
echo "First line"
echo "Second line"
EOF

...正确发射(破折号 0.5.10.2):

:2+echo First line
First line
:3+echo Second line
Second line

【讨论】:

  • 当我尝试这个时,我得到,例如::+echo Second line Get no line number。
  • 有趣。很可能是 dash 中一个相对较新的功能(因为您运行的是 2016 年的 Ubuntu,而且我知道它是 POSIX 标准的 2017 年版本,用于指定功能);我没有时间浏览历史并确定他们现在何时添加。
  • 经过测试,不适用于 packages.debian.org/buster/dash (0.5.10.2-5) 或 packages.ubuntu.com/focal/dash (0.5.10.2-6) wiki.ubuntu.com/DashAsBinSh#A.24LINENO 状态 POSIX requires that conforming shells expand the special parameter $LINENO to the current line number in a script or function; dash does not yet support this feature.
  • 有趣。我可能使用 NixOS 构建进行了测试——这是我的典型平台;我需要查看 nixpkgs 以了解他们是否以及何时修补它。
  • Debian 的 dash 软件包由于使用 --disable-lineno 编译而故意缺少 $LINENO,这是其他软件包中 bashisms 的可悲解决方法;请参阅 debian bug 842242 获取最近的摘要或 debian bug 582952 获取原始线程。
猜你喜欢
  • 2013-01-29
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2012-02-05
相关资源
最近更新 更多