2010-06-16 8 views
22

Gibt es eine Variable in bash, die den Namen der ausgeführten .sh Datei enthält?
Die Zeilennummer wäre auch toll.Äquivalent von `__FILE__`,` __LINE__` in Bash

Ich möchte es in Fehlermeldungen verwenden, wie zum Beispiel:
echo "ERROR: [$ FILE: L $ LINE] $ somefile nicht gefunden"

Antwort

20
#!/bin/bash 

echo $LINENO 
echo `basename $0` 

$LINENO für die aktuelle Zeilennummer $0 für die aktuelle Datei. Ich habe basename verwendet, um sicherzustellen, dass Sie nur den Dateinamen und nicht den Pfad erhalten.

UPDATE:

#!/bin/bash 

MY_NAME=`basename $0` 

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

ouch $LINENO 

Sie haben die Linie als Parameter zu übergeben, wenn Sie die Funktion Ansatz verwenden, sonst werden Sie die Linie der Funktionsdefinition erhalten.

+3

'base $ 0' (kein 'echo' ist notwendig) –

+3

Beachten Sie, dass' basename $ 0' das Eltern-Skript zurückgibt, wenn Sie das Skript 'quellen'. – scribu

+2

Und auch das funktioniert nicht gut in Skripten geladenen Login-Shell (~ /. Bashrc, /etc/profile.d/*). "BASH_SOURCE" und "BASH_LINENO" sind viel besser, obwohl sie Bashismen sind. – pevik

2

Die Variable $ 0 geben Sie den Namen der ausführenden Schale Skript in der Bash.

6

Sie müssen nur

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

'Basisname $ 0' (kein' Echo' ist notwendig) –

15

ich die "BASH_SOURCE" und "BASH_LINENO" built-in-Arrays sehr nützlich finden:

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

Aufrufen xx Ausbeuten

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

Ich bevorzuge auch die Verwendung von BASH_ * Variablen, wie Sie sie beschrieben haben. Hier ist ein guter Artikel zum Debuggen von Bash-Skripten, auf die ich in der Vergangenheit verwiesen habe: http://aymanh.com/how-debug-bash-scripts –

+0

das ist schön –