从名称

时间:2016-07-21 14:53:28

标签: bash shell

一个搭便车的人,在一个功能完成的时候已经消失了,希望找到一个功能所在的位置,以便他可以通过编辑文件位置来观察自己的功能。他不希望将函数体打印到shell,只需获取包含该函数的脚本文件的路径。我们的搭便车只知道他的功能名称,即answer_life

想象一下,他在文件universal-questions.sh中有一个函数,定义如下,其路径不为我们的搭便车所知:

function answer_life() {
    sleep $(date --date='7500000 years' +%s)

    echo "42"
}

另一个名为hitchhiker-helper-scripts.sh的脚本定义如下。它具有上面source'd的功能(搭便车者也不理解source,我想。只是打球。):

source "/usr/bin/universal-questions.sh"

function find_life_answer_script() {
    # Print the path of the script containing `answer_life`
    somecommand "answer_life" # Should output the path of the script containing the function.
}

所以这个,我的无畏脚本编写器,就是你进来的地方。你能用find_life_answer_script中的代码替换注释,允许我的搭便车找到函数所在的位置吗?

2 个答案:

答案 0 :(得分:4)

在扩展调试模式下运行的bash中,declare -F将为您提供函数名称,行号和路径(源代码):

function find_life_answer_script() {
    ( shopt -s extdebug; declare -F answer_life )
}

像:

$ find_life_answer_script
answer_life 3 ./universal-questions.sh

运行子shell可让您设置extdebug模式,而不会影响任何先前的设置。

答案 1 :(得分:1)

你的搭便车也可以尝试以这种方式找到答案:

script=$(readlink -f "$0")

sources=$(grep -oP 'source\s+\K[\w\/\.]+' $script)

for s in "${sources[@]}"
do
  matches=$(grep 'function\s+answer_life' $s)
  if [ -n "${matches[0]}" ]; then
    echo "$s: Nothing is here ("
  else
    echo "$s: Congrats! Here is your answer!"
  fi
done

如果调试模式在某个星球上不可用,则会出现这种情况)