Во время выполнения сценариев оболочки, как узнать, какой номер строки, который он выполняет, нужно написать обертку, где я могу выполнить скрипты оболочки из сценариев оболочки и узнать, какой номер строки она выполняет.
При выполнении сценариев оболочки, как узнать, какой номер строки он выполняет,
Ответ 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
, чтобы быть понятной). Он не даст вам номер строки, но сообщит о текущей строке.
Альтернативный, но более болезненный подход - использовать обработчик ловушки, как описано здесь.