【发布时间】: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
【问题讨论】:
-
LINENO和PS4是 POSIX 指定的功能,尽管是可选的(仅在实现标准的用户可移植实用程序附件的 shell 中需要)。你能指定你正在测试的/bin/sh的具体实现吗? -
...嗯?我上面评论的全部要点是,包含交互式使用选项的
/bin/sh实现已经需要支持LINENO和PS4,所以这个问题实际上没有意义,除非你将其缩小到可以观察到不起作用的特定实现。 -
如果您展示了您的测试方式也会很有帮助。您是想通过环境传入
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)?