При выполнении сценариев оболочки, как узнать, какой номер строки он выполняет,

Во время выполнения сценариев оболочки, как узнать, какой номер строки, который он выполняет, нужно написать обертку, где я могу выполнить скрипты оболочки из сценариев оболочки и узнать, какой номер строки она выполняет.

Ответы

Ответ 1

Вы можете установить переменную PS4 для вывода set -x для включения номера строки:

PS4=':${LINENO}+'
set -x

Это поместит номер строки перед каждой строкой по мере ее выполнения:

:4+command here
:5+other command

Очень важно иметь некоторый символ сигилы (например, + в моих примерах) после разложений переменных в PS4, потому что последний символ повторяется, чтобы показать глубину вложенности. То есть, если вы вызываете функцию, и эта функция вызывает команду, вывод из set -x будет сообщать об этом так:

:3+++command run within a function called from a function
:8++command run within a function
:19+line after the function was called

Если для запуска script задействовано несколько файлов, вы можете включить переменную BASH_SOURCE, а не только LINENO (при условии, что это действительно есть bash script, а не /bin/sh - убедитесь, что ваш script начинается с #!/bin/bash!):

PS4=':${BASH_SOURCE}:${LINENO}+'
set -x

Ответ 2

Bash имеет специальную переменную $LINENO, которая делает то, что вы хотите.

#!/bin/bash
echo "$LINENO"
echo "$LINENO"
echo "$LINENO"

Демо:

$ ./lineno
2
3
4

Ответ 3

#!/bin/sh -x

будет сообщать строки по мере их выполнения (опция -x, чтобы быть понятной). Он не даст вам номер строки, но сообщит о текущей строке.

Альтернативный, но более болезненный подход - использовать обработчик ловушки, как описано здесь.