Bash 从源文件中查找函数调用的行号

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()

我试图找到一种方法来找出调用函数的文件和行号。该函数位于一个库文件中,该文件由我的脚本提供

文件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() {
$  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-杰出!