我的工作环境中有很多遗留的Shell脚本魔术。bash函数是从命令行中大量使用的东西,它们从我的.bash_profile中包含的某个文件中包含的某个文件中获取。有没有一种方法可以获取这些功能的定义,甚至更好地定义这些功能的位置,而无需跟踪5个包含级别?
我的工作环境中有很多遗留的Shell脚本魔术。bash函数是从命令行中大量使用的东西,它们从我的.bash_profile中包含的某个文件中包含的某个文件中获取。有没有一种方法可以获取这些功能的定义,甚至更好地定义这些功能的位置,而无需跟踪5个包含级别?
Answers:
要获得函数定义:
type -a function_name
whence -f function_name
在zsh
假设您有一个名为foo的函数,下面的命令将获取该函数定义的位置,即它将获取定义该函数的文件的名称以及该文件中定义该函数的行号。
# Turn on extended shell debugging
shopt -s extdebug
# Dump the function's name, line number and fully qualified source file
declare -F foo
# Turn off extended shell debugging
shopt -u extdebug
就我而言,这些命令的输出为:
foo 32 /source/private/main/developer/cue.pub.sh
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
而不更改当前shell的状态:(whichfunc () ( shopt -s extdebug; declare -F "$1"; )
请注意使用(...)
代替{...}
)。
bash -x
将在启动时转储正在运行的bash,这将使您更轻松地对其进行跟踪。不要忘记退出新打开的外壳。
script out.txt bash -x
(再次,不要忘记这样做exit
)。
换句话说,我最近发现更简单:
which <functionname>
(这还将显示它是别名还是脚本,但不会跟踪别名的来源)
which
提供有关BSD或Mac上别名的信息。此外,此问题与功能有关,而which
没有提供有关功能的信息。