在Shell脚本中,可以通过Bash的内置变量$BASH_SOURCE和$FUNCNAME来实现打印被调用文件名和函数名。

具体的代码如下:

#!/bin/bash

function foo() {
  echo "Function name: ${FUNCNAME[0]}, Called from file: ${BASH_SOURCE[1]}"
}

foo

在上面的例子中,foo()函数会打印它自己的函数名${FUNCNAME[0]}以及调用它的文件名${BASH_SOURCE[1]}。当脚本运行时,输出会显示为:

Function name: foo, Called from file: test.sh

其中test.sh是包含foo()函数的脚本文件名。

更详细的回复

在shell脚本中,可以通过在函数中添加一些特定的代码实现打印被调用文件名和函数名的功能,这些代码会将信息输出到日志文件或标准输出中。通常情况下,我们可以使用BASH_SOURCE变量来获取当前正在执行的脚本的文件名,并使用FUNCNAME变量来获取当前正在执行的函数名称。以下是一个示例代码,演示如何在shell脚本中实现打印被调用文件名和函数名的功能:

#!/bin/bash

function foo() {
    echo "Function name: ${FUNCNAME[0]}"
    echo "File name: ${BASH_SOURCE[0]}"
}

foo

在这个简单的例子中,我们定义了一个名为foo的函数,并在其中打印了当前正在执行的函数名称和脚本文件名称。然后,在脚本的末尾,我们调用了foo函数。当脚本执行时,它会输出以下内容:

Function name: foo
File name: /path/to/script.sh

除了上述示例代码中提到的方法之外,还有其他一些方法可以实现相同的功能。例如,我们可以使用caller命令来获取正在执行的函数信息。以下是一个示例代码,演示如何在shell脚本中使用caller命令打印被调用文件名和函数名的功能:

#!/bin/bash

function foo() {
    local i=0
    while caller $i; do
        ((i++))
    done
}

foo

在这个示例代码中,我们定义了一个名为foo的函数,并使用while循环和caller命令来获取正在执行的函数信息。当脚本执行时,它会输出以下内容:

1 foo /path/to/script.sh

以上是两种常用的实现方式,当然也有其他的方法可以实现相同的功能,具体实现方式取决于需要解决的问题的具体情况。