У меня есть тестовый скрипт, который имеет множество команд и будет генерировать много вывода, я использую set -x
или set -v
и set -e
, поэтому скрипт остановится при возникновении ошибки. Однако мне все еще довольно сложно определить, в какой строке остановилось выполнение, чтобы найти проблему. Есть ли метод, который может выводить номер строки скрипта перед выполнением каждой строки? Или выведите номер строки перед выставкой команды, сгенерированной set -x
? Или любой метод, который может решить мою проблему с местоположением строки сценария, будет большим подспорьем. Спасибо.
89
echo
echo
заявлений лучше избегать.-x
должны печатать номера строк. Или, может быть -nx
должен включать номера строк. Для меня это один из тех моментов "WTF" ...\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
для некоторых цветовВ Bash
$LINENO
содержит номер строки, в которой в данный момент выполняется скрипт.Если вам нужно узнать номер строки, в которой была вызвана функция, попробуйте
$BASH_LINENO
. Обратите внимание, что эта переменная представляет собой массив.Например:
#!/bin/bash function log() { echo "LINENO: ${LINENO}" echo "BASH_LINENO: ${BASH_LINENO[*]}" } function foo() { log "$@" } foo "$@"
Подробнее о переменных Bash см. Здесь .
источник
Простое (но мощное) решение: поместите
echo
вокруг кода, который, по вашему мнению, вызывает проблему, и перемещайтеecho
построчно, пока сообщения не перестанут появляться на экране, потому что скрипт остановился из-за предыдущей ошибки.Еще более мощное решение: установите
bashdb
отладчик bash и построчно отлаживайте скрипт.источник
echo
Во многих случаях это может помочь, но терпит неудачу, когда вы пытаетесь применить его в функциях, которые имеют осмысленный, анализируемый вывод.echo "foo" >&2
Обходной путь для оболочек без LINENO
В довольно сложном сценарии я не хотел бы видеть все номера строк; скорее я хотел бы контролировать выход.
Определите функцию
echo_line_no () { grep -n "$1" $0 | sed "s/echo_line_no//" # grep the line(s) containing input $1 with line numbers # replace the function name with nothing } # echo_line_no
Используйте его с кавычками вроде
echo_line_no "this is a simple comment with a line number"
Выход
16 "this is a simple comment with a line number"
если номер этой строки в исходном файле равен 16.
Это в основном отвечает на вопрос, как показать номер строки при выполнении сценария bash для пользователей ash или других оболочек без
LINENO
.Есть что еще добавить?
Конечно. зачем вам это? Как с этим работать? Что с этим делать? Действительно ли этого простого подхода достаточно или полезно? Почему вы вообще хотите с этим повозиться?
Хотите узнать больше? Прочтите размышления по отладке
источник