Bash:从函数返回行号

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)

仍然得到行号?

l0b*_*0b0 5

您应该可以使用 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 获取当前行号。