2012-06-18 9 views
9

Ich versuche einen Weg zu finden, um herauszufinden, aus welcher Datei- und Zeilennummer eine Funktion aufgerufen wurde. Die Funktion befindet sich in einer Bibliotheksdatei, die von meinem Skript bezogen wird.Bash: Finde die Nummer des Funktionsaufrufs aus der Sourcing-Datei

file1:

$source file2 
$warn_me "Error: You didn't do something" 

file2:

$function warn_me() { 
$ message=???? 
$ echo ${message} 
$} 

gewünschte Ausgabe:$: file1: Zeile 2: Fehler: Sie haben nicht etwas

Die Funktion In vielen Dateien tritt der Ionenaufruf bereits viele Male auf, also versuche ich, einen Weg zu finden, dies zu ändern, ohne das zu ändern.

Bisher wurde die warn_me Funktion in jeder Datei definiert, die es verwendet, und dies wurde wie so gesorgt:

$local message="$BASH_SOURCE:(""${BASH_LINENO}): ""$*" 

Antwort

10

Sie suchen caller es scheint.

$ cat h.sh 
#! /bin/bash 
function warn_me() { 
    echo "[email protected]" 
    caller 
} 
$ cat g.sh 
#!/bin/bash 
source h.sh 
warn_me "Error: You didn't do something" 
$ . g.sh 
Error: You didn't do something 
3 g.sh 
+1

Danke, ich ersetzte die Zeile mit: $ local message = "$ BASH_SOURCE [1] :(" "$ {BASH_LINENO}):" "$ *" – spizzak

6

von @nosid inspiriert und @Wrikken schrieb ich eine kleine Funktion aktuellen Stack-Trace in eine Variable setzen $ STACK genannt. Es kann nützlich sein, dem Benutzer den Ort auszugeben, an dem ein Fehler aufgetreten ist. Schade, Bash hat keinen eingebauten printStackTrace ... Hoffentlich könnte jemand es in ihren Projekten nützlich finden.

Update: Ich habe einen Tippfehler korrigiert und einen Fehlermeldungs-Parameter hinzugefügt. Der erste Parameter der Funktion ist also eine Fehlermeldung, die dem Stack-Trace hinzugefügt werden muss. Übrigens, wenn Ihr Skript auf bash 's stdin (eine schlechte Idee in den meisten Fällen), dann würde die erste Position verloren gehen. Wenn nötig, ändern Sie sie in for in i<$stack_size + 1. Aber wie gesagt, es ist keine gute Idee, das Skript in bash `s stdin, here's why zu füttern.

Update 2: Ich habe festgestellt, ich habe eine older answer darüber. Dachte besser, aktualisierte Version des Codes an einem Ort zu halten. Also beschlossen, eine gist zu machen. Fühlen Sie sich frei, Verbesserungen des Kerns vorzuschlagen. Ich werde versuchen, diese Antwort auf dem neuesten Stand zu halten, wenn irgendwelche Änderungen auftreten, aber ich kann nicht garantieren.

Verwandte Themen