Dan*_*and 2 error-handling bash function line-numbers
我正在尝试在 bash 脚本中实现一个中止函数,目前它看起来像这样:
function abort {
LOGFILE=/var/log/bash_test
DATE=$(date "+%Y %b %a %H:%M:%S")
printf "\n------| ERROR: %s line %03d in %s |------\n" "$DATE" "$2" "${0}" >> "$LOGFILE"
echo "$1" >> "$LOGFILE"
}
abort "Some kind of error..." $LINENO
Run Code Online (Sandbox Code Playgroud)
这将在 /var/log/bash_test 中产生
------| ERROR: 2014 Jan Tue 12:50:12 line 007 in /home/user/test.sh |------
Some kind of error
Run Code Online (Sandbox Code Playgroud)
我的问题是:手动给出行号的方法(例如 $2 < $LINENO)既丑陋又重复。有没有办法让这个函数自动从函数外部检测 $LINENO ?这样我就可以发出命令
abort "Some kind of error..."
Run Code Online (Sandbox Code Playgroud)
仍然得到行号?
您应该可以使用 BASH_LINENO:
$ cat test.sh
my_environment() {
echo "Stack size: ${#BASH_LINENO[@]}"
echo "Caller line: ${BASH_LINENO[$((${#BASH_LINENO[@]} - 2))]}"
}
my_environment
$ sh test.sh
Stack size: 2
Caller line: 5
Run Code Online (Sandbox Code Playgroud)
也就是说,倒数第二个条目将是调用my_environment发生的行号。
从关于man bash部分BASH_LINENO:
一个数组变量,其成员是源文件中的行号,其中调用了 FUNCNAME 的每个相应成员。${BASH_LINENO[$i]} 是源文件 (${BASH_SOURCE[$i+1]}) 中调用 ${FUNCNAME[$i]} 的行号(或 ${BASH_LINENO[$i-1] } 如果在另一个 shell 函数中引用)。使用 LINENO 获取当前行号。