2010-06-16 16 views

Odpowiedz

20
#!/bin/bash 

echo $LINENO 
echo `basename $0` 

$LINENO dla bieżącego numeru linii $0 dla bieżącego pliku. Użyłem basename, aby upewnić się, że otrzymujesz tylko nazwę pliku, a nie ścieżkę.

UPDATE:

#!/bin/bash 

MY_NAME=`basename $0` 

function ouch { 
    echo "Fail @ [${MY_NAME}:${1}]" 
    exit 1 
} 

ouch $LINENO 

musiał przejść linię jako parametr w przypadku korzystania z funkcji innego podejścia dostaniesz linii definicji funkcji.

+3

'basename $ 0' (nie trzeba "echo") –

+3

Zwróć uwagę, że jeśli 'source' skryptu,' basename $ 0' zwróci skrypt macierzysty. – scribu

+2

A także to nie działa dobrze w skryptach z załadowaną powłoką logowania (~/.bashrc, /etc/profile.d/*). "BASH_SOURCE" i "BASH_LINENO" są znacznie lepsze, chociaż są bashisms. – pevik

2

Zmienna $ 0. daje nazwę powłoki wykonującego skrypt w bashu.

6

Wystarczy

echo $LINENO 
echo $(basename $0) 
+0

'basename $ 0' (nie jest konieczne" echo ") –

15

znajdę "BASH_SOURCE" i "BASH_LINENO" wbudowane w układach bardzo użyteczne:

$ cat xx 
#!/bin/bash 

_ERR_HDR_FMT="%.23s %s[%s]: " 
_ERR_MSG_FMT="${_ERR_HDR_FMT}%s\n" 

error_msg() { 
    printf "$_ERR_MSG_FMT" $(date +%F.%T.%N) ${BASH_SOURCE[1]##*/} ${BASH_LINENO[0]} "${@}" 
} 

error_msg "here" 


error_msg "and here" 

Wywoływanie plony xx

2010-06-16.15:33:13.069 xx[11]: here 
2010-06-16.15:33:13.073 xx[14]: and here 
+0

Wolę też używać zmiennych BASH_ *, tak jak je opisałeś. Oto dobry artykuł na temat debugowania skryptów bash, o których pisałem w przeszłości: http://aymanh.com/how-debug-bash-scripts –

+0

to jest piękne –