Bash 从源文件中查找函数调用的行号
我试图找到一种方法来找出调用函数的文件和行号。该函数位于一个库文件中,该文件由我的脚本提供 文件1:Bash 从源文件中查找函数调用的行号,bash,logging,scripting,Bash,Logging,Scripting,我试图找到一种方法来找出调用函数的文件和行号。该函数位于一个库文件中,该文件由我的脚本提供 文件1: $source file2 $warn_me "Error: You didn't do something" $function warn_me() { $ message=???? $ echo ${message} $} 文件2: $source file2 $warn_me "Error: You didn't do something" $function warn_me()
$source file2
$warn_me "Error: You didn't do something"
$function warn_me() {
$ message=????
$ echo ${message}
$}
文件2:
$source file2
$warn_me "Error: You didn't do something"
$function warn_me() {
$ message=????
$ echo ${message}
$}
所需的输出:$:文件1:第2行:错误:您没有执行某些操作
函数调用已经在很多文件中出现过很多次,所以我正在尝试找到一种方法来实现这一点,而不改变它
以前,warn_me函数是在使用它的每个文件中定义的,它是这样处理的:
$local message="$BASH_SOURCE:(""${BASH_LINENO}): ""$*"
有三个数组变量可用于此目的:
FUNCNAME
BASH\u源代码
BASH\u LINENO
- 您正在寻找它
$ cat h.sh
#! /bin/bash
function warn_me() {
echo "$@"
caller
}
$ cat g.sh
#!/bin/bash
source h.sh
warn_me "Error: You didn't do something"
$ . g.sh
Error: You didn't do something
3 g.sh
受@nosid和@Wrikken的启发,我编写了一个小函数,将当前堆栈跟踪放入名为$stack的变量中。向用户输出发生错误的位置可能很有用。太糟糕了,bash没有内置的printStackTrace。。。希望有人能在他们的项目中找到它
function get_stack () {
STACK=""
local i message="${1:-""}"
local stack_size=${#FUNCNAME[@]}
# to avoid noise we start with 1 to skip the get_stack function
for (( i=1; i<$stack_size; i++ )); do
local func="${FUNCNAME[$i]}"
[ x$func = x ] && func=MAIN
local linen="${BASH_LINENO[$(( i - 1 ))]}"
local src="${BASH_SOURCE[$i]}"
[ x"$src" = x ] && src=non_file_source
STACK+=$'\n'" at: "$func" "$src" "$linen
done
STACK="${message}${STACK}"
}
函数get\u堆栈(){
STACK=“”
本地i消息=“${1:-”“}”
本地堆栈_size=${#FUNCNAME[@]}
#为了避免噪声,我们从1开始跳过get_stack函数
对于((i=1;iThanks,我最终将行替换为:$local message=“$BASH_-SOURCE[1]:(${BASH_-LINENO}):“$*”是否存在caller
优于BASH_-SOURCE[x]
、BASH_-LINENO[x-1]
和FUNCNAME[x]
?请参见此处的日志记录和错误处理实现:。它使用BASH_源和BASH_LINENO数组。@codeforester-杰出!