解析声明结果中的第三个条目

解析声明结果中的第三个条目

我有这个:

cd 31 /Users/alexamil/WebstormProjects/oresoftware/botch/botch-shell-overrides.sh

上述样式输出由以下命令给出:

declare -F my_bash_func

如何从结果中获取文件名?就像是:

file=$(declare -F my_bash_func | grab_3rd_entry)

我必须使用:

shopt -s extdebug
declare -F my_bash_func
shopt -u extdebug

但这在 MacOS 上不起作用:

shopt -s extdebug
declare -pf my_bash_func
shopt -u extdebug

后者会产生一个奇怪的错误:

声明:my_bash_func:未找到

但使用声明 -F 可以找到该函数,因此不确定为什么该-pf选项不起作用。

答案1

您可以awk为此使用:

file=$(declare -F my_bash_func | awk '{print $3}')

或者使用 bash 内置函数,将其读入数组:

func_info=( $(declare -F my_bash_func) )
file=${func_info[2]}
line_number=${func_info[1]}

但请注意,declare -F my_bash_func输出对解析器不太友好...如果包含该函数的文件源自相对路径,则输出extdebug将仅打印相对路径(即使您不再位于该目录中。)此外,如果路径有任何空格或不可打印的字符,这些字符将保留在输出中(因此“第三个字段”可能不正确......)

相关内容