一个搭便车的人,在一个功能完成的时候已经消失了,希望找到一个功能所在的位置,以便他可以通过编辑文件位置来观察自己的功能。他不希望将函数体打印到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
中的代码替换注释,允许我的搭便车找到函数所在的位置吗?
答案 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
如果调试模式在某个星球上不可用,则会出现这种情况)