调试(-x)时如何在Shell(/ bin / sh)脚本中显示行号?

时间:2019-04-01 15:22:55

标签: linux shell unix sh

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

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

PS4='Line ${LINENO}: '

我期望以下输出:

123: + echo test

但是外壳$LINENO中什么也没有。

我正在使用ubuntu 16.04 x64和破折号版本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

1 个答案:

答案 0 :(得分:1)

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

此外,破折号是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