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