Как показать номер строки в сценарии Shell (/ bin / sh) при отладке (-x)? - PullRequest
1 голос
/ 01 апреля 2019

Я отлаживаю скрипт в DASH SHELL, используя #!/bin/sh -x, и я хотел бы показать номер строки скрипта при отладке.

Уже пытались изменить переменную PS4 (как показано в этот ответ ), но безуспешно, потому что она работает только в bash, мне нужна оболочка.

PS4='Line ${LINENO}: '

Я ожидаю следующий вывод:

123: + echo test

Но в $LINENO нет ничего в оболочке.

Я использую 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

1 Ответ

1 голос
/ 01 апреля 2019

Вся описанная здесь функциональность уже требуется в приложении «Утилиты переносимости пользователя» к стандарту POSIX.

Более того, в dash, самой распространенной реализации не-bash /bin/sh в Linux, уже встроена эта функциональность.-в, как вы можете проверить ниже:

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
...