Linux

發生錯誤時如何在 Bash 中找到行號?

  • May 17, 2021

如何在 Bash 中找到發生錯誤的行號?

例子

我創建了以下帶有行號的簡單腳本來解釋我們需要什麼。該腳本將從

cp $file1 $file2
cp $file3 $file4

當其中一個cp命令失敗時,該函式將以 exit 1 退出。我們希望向函式添加功能,以便還使用行號(例如,8 或 12)列印錯誤。

這可能嗎?

範例腳本

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

我不會使用您的功能,而是使用此方法:

$ cat yael.bash
#!/bin/bash

set -eE -o functrace

file1=f1
file2=f2
file3=f3
file4=f4

failure() {
 local lineno=$1
 local msg=$2
 echo "Failed at $lineno: $msg"
}
trap 'failure ${LINENO} "$BASH_COMMAND"' ERR

cp -- "$file1" "$file2"
cp -- "$file3" "$file4"

這通過擷取 ERR 然後failure()使用目前行號 + 執行的 bash 命令呼叫該函式來工作。

例子

在這裡,我沒有註意創建文件、f1f2f3f4. 當我執行上面的腳本時:

$ ./yael.bash
cp: cannot stat ‘f1’: No such file or directory
Failed at 17: cp -- "$file1" "$file2"

它失敗了,報告行號加上執行的命令。

引用自:https://unix.stackexchange.com/questions/462156