Подтвердить что ты не робот

Как показать номер строки при выполнении bash script

У меня есть тест script, который имеет много команд и будет генерировать много вывода, я использую set -x или set -v и set -e, поэтому script будет останавливаться при возникновении ошибки. Однако мне все же довольно сложно определить, какая строка остановилась, чтобы найти проблему. Есть ли метод, который может выводить номер строки script перед выполнением каждой строки? Или вывести номер строки перед командной выставкой, созданной set -x? Или любой способ, который может решить мою проблему с расположением строк script, будет большой помощью. Спасибо.

4b9b3361

Ответ 1

Вы упомянули, что уже используете -x. Переменная PS4 обозначает значение - это приглашение, напечатанное до того, как командная строка будет эхом, когда установлен параметр -x и по умолчанию будет :, за которым следует пробел.

Вы можете изменить PS4, чтобы исправить LINENO (номер строки в выполняемой функции script или оболочки).

Например, если ваш script читает:

$ cat script
foo=10
echo ${foo}
echo $((2 + 2))

Выполнение этого, таким образом, приведет к печати номеров строк:

$ PS4='Line ${LINENO}: ' bash -x script
Line 1: foo=10
Line 2: echo 10
10
Line 3: echo 4
4

http://wiki.bash-hackers.org/scripting/debuggingtips дает окончательный PS4, который выводит все, что вам понадобится для трассировки:

export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

Ответ 2

В Bash, $LINENO содержится номер строки, в которой выполняется script.

Если вам нужно знать номер строки, где была вызвана функция, попробуйте $BASH_LINENO. Обратите внимание, что эта переменная является массивом.

Например:

#!/bin/bash       

function log() {
    echo "LINENO: ${LINENO}"
    echo "BASH_LINENO: ${BASH_LINENO[*]}"
}

function foo() {
    log "[email protected]"
}

foo "[email protected]"

Подробнее о переменных Bash см. здесь.

Ответ 3

Простое (но мощное) решение. Поместите echo вокруг кода, который, по вашему мнению, вызывает проблему, и перемещайте echo по очереди, пока сообщения больше не появятся на экране, потому что script имеет остановку, потому что ошибки до.

Еще более мощное решение: установите bashdb отладчик bash и отлаживайте script по строкам