Linux
發生錯誤時如何在 Bash 中找到行號?
如何在 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 命令呼叫該函式來工作。例子
在這裡,我沒有註意創建文件、
f1
、f2
、f3
或f4
. 當我執行上面的腳本時:$ ./yael.bash cp: cannot stat ‘f1’: No such file or directory Failed at 17: cp -- "$file1" "$file2"
它失敗了,報告行號加上執行的命令。