2012-05-30 9 views

Odpowiedz

20

Można ustawić zmienną PS4 spowodować set -x wyjście zawierać numer linia:

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

To będzie umieścić numer wiersza przed każdym wierszu, jak to wykonuje:

:4+command here 
:5+other command 

Ważne jest, aby w swoich przykładach mieć pewne znaki (takie jak +) po zmiennych rozszerzeniach w PS4, ponieważ ten ostatni znak jest powtarzany, aby pokazać głębokość zagnieżdżenia. Oznacza to, że jeśli wywołanie funkcji, a funkcja wywołuje polecenie, wyjście z set -x zgłosi go tak:

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

Jeśli wiele plików są zaangażowane w prowadzenie skrypt, może chcesz dołączyć BASH_SOURCE zmienna w przeciwieństwie do tylko LINENO (zakładając, że to naprawdę jest skrypt bash, w przeciwieństwie do /bin/sh - mieć pewność, że skrypt zaczyna #!/bin/bash!):

PS4=':${BASH_SOURCE}:${LINENO}+' 
set -x 
5
#!/bin/sh -x 

zgłosi linie jak są one realizowane (opcja -x, aby być jasne). Nie poda on numeru o numerze, ale zgłosi aktualną linię.

Alternatywnym, ale bardziej bolesnym podejściem jest użycie obsługi pułapek, zgodnie z dokumentacją here.

+1

i '-xv' daje jeszcze więcej informacji. – choroba

6

Bash ma specjalną zmienną $LINENO, która robi to, co chcesz.

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

Demo:

$ ./lineno 
2 
3 
4 
Powiązane problemy