Wie finde ich die Zeilennummer in Bash, in der ein Fehler aufgetreten ist?
Beispiel
Ich erstelle das folgende einfache Skript mit Zeilennummern, um zu erklären, was wir brauchen. Das Skript kopiert Dateien von
cp $file1 $file2
cp $file3 $file4
Wenn einer der cp
Befehle fehlschlägt, wird die Funktion mit Exit 1 beendet . Wir möchten der Funktion die Möglichkeit hinzufügen, den Fehler auch mit der Zeilennummer auszudrucken (z. B. 8 oder 12).
Ist das möglich?
Beispielskript
1 #!/bin/bash
2
3
4 function in_case_fail {
5 [[ $1 -ne 0 ]] && echo "fail on $2" && exit 1
6 }
7
8 cp $file1 $file2
9 in_case_fail $? "cp $file1 $file2"
10
11
12 cp $file3 $file4
13 in_case_fail $? "cp $file3 $file4"
14
set -x
und / oder verwenden, umset -v
zu verfolgen, was ausgeführt wurde. Nicht genau das, wonach Sie gefragt haben, aber es wird wahrscheinlich auch hilfreich sein.Antworten:
Anstatt Ihre Funktion zu verwenden, würde ich stattdessen diese Methode verwenden:
Dies funktioniert, indem Sie ERR abfangen und dann die
failure()
Funktion mit der aktuellen Zeilennummer + Bash-Befehl aufrufen, der ausgeführt wurde.Beispiel
Hier habe ich keine Sorge genommen , um die Dateien zu erstellen,
f1
,f2
,f3
, oderf4
. Wenn ich das obige Skript ausführe:Es schlägt fehl und gibt die Zeilennummer plus den ausgeführten Befehl an.
quelle
Neben
LINENO
der aktuellen Zeilennummer stehen die ZeichenBASH_LINENO
undFUNCNAME
(undBASH_SOURCE
Arrays ), die die Funktionsnamen und Zeilennummern enthalten, von denen aus sie aufgerufen werden.Sie könnten also so etwas tun:
Laufen würde das drucken
Wenn Sie
set -e
oder verwendentrap ... ERR
, um Fehler automatisch zu erkennen, beachten Sie, dass sie einige Einschränkungen aufweisen. Es ist auch schwieriger, eine Beschreibung der Funktionsweise des Skripts (wie in Ihrem Beispiel) einzufügen, obwohl dies für einen normalen Benutzer möglicherweise nützlicher ist als nur die Zeilennummer.Siehe zB diese für die Probleme mit
set -e
und anderen:quelle
Bash hat eine eingebaute Variable,
$LINENO
die in einer Anweisung durch die aktuelle Zeilennummer ersetzt wirdSie können auch versuchen,
trap ... ERR
die Methode zu verwenden, die ausgeführt wird, wenn ein Befehl fehlschlägt (wenn das Ergebnis nicht getestet wird). Z.B:Wenn ein Befehl wie
cp $file1 $file2
fehlschlägt, erhalten Sie die Fehlermeldung mit der Zeilennummer und einem Exit. Sie finden den fehlerhaften Befehl auch in Variable$BASH_COMMAND
(obwohl keine Umleitungen usw.).quelle