2010-06-16 9 views

risposta

20
#!/bin/bash 

echo $LINENO 
echo `basename $0` 

$LINENO per l'attuale numero di riga $0 per il file corrente. Ho usato basename per assicurarmi di ottenere solo il nome del file e non il percorso.

UPDATE:

#!/bin/bash 

MY_NAME=`basename $0` 

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

ouch $LINENO 

Devi passare la linea come un parametro se si utilizza la funzione di approccio altrimenti si otterrà la linea della definizione di funzione.

+3

'basename $ 0' (non è necessario 'echo') –

+3

Si noti che se si' sorgente' lo script, 'basename $ 0' restituirà lo script genitore. – scribu

+2

E anche questo non funziona bene nella shell di login caricata dagli script (~/.bashrc, /etc/profile.d/*). "BASH_SOURCE" e "BASH_LINENO" sono molto meglio, anche se sono dei bashismi. – pevik

2

La variabile $ 0, si darà il nome della shell in esecuzione script in bash.

6

Hai solo bisogno di

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

'basename $ 0' (non è necessario' echo') –

15

trovo il "BASH_SOURCE" e "BASH_LINENO" matrici built-in molto utili:

$ 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" 

Invocare rendimenti xx

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

Preferisco anche utilizzare le variabili BASH_ * come le hai descritte. Ecco un buon articolo su come eseguire il debug di script di bash a cui ho fatto riferimento in passato: http://aymanh.com/how-debug-bash-scripts –

+0

questo è bello –