我无法弄清楚如何找到定义了bash函数的文件(__git_ps1
在我的情况下)。
我尝试了declare
,type
,which
,但没有告诉我的源文件。我读到declare
可以打印文件名和行号的地方,但是没有说明如何打印。的help
页面declare
也不说。
我如何获得此信息?
我无法弄清楚如何找到定义了bash函数的文件(__git_ps1
在我的情况下)。
我尝试了declare
,type
,which
,但没有告诉我的源文件。我读到declare
可以打印文件名和行号的地方,但是没有说明如何打印。的help
页面declare
也不说。
我如何获得此信息?
Answers:
如果准备运行该函数,则可以通过set -x
跟踪执行和设置PS4
变量来获取信息。
从bash开始,--debugger
或shopt -s extdebug
用于记录额外的调试信息。
设置PS4
,在跟踪时显示“提示”以显示源代码行。
打开跟踪。
然后,您可以运行函数,并且对于每一行,您将获得函数的文件名。
用于set +x
关闭跟踪。
因此,在这种情况下,您可以运行
bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x
如果您不愿意运行该功能,则仍然可以设置调试并获取信息。步骤是
bash --debugger
或shopt -s extdebug
在定义函数之前。declare -F __git_ps1
并将报告该函数的定义位置。
与使用PS4查看带注释的执行跟踪相比,此方法的优点是
执行跟踪的优点是
我强烈建议shopt -s extdebug
同时使用两者,~/.bashrc
并~/.bash_profile
介绍不同调用情况下使用的不同文件。
shopt -s extdebug
调用,它也将起作用。如果通过声明函数,请注意行号可能会关闭(当前错误)eval
。
bash --debugger
我必须实际触发完成操作以获取定义的完成功能并从中获取报告之后declare -F _vpnc
。
@icarus的出色解决方案适用于函数,只要它们是按字面定义的,而不是eval
另一个文件的内容(其中带有的文件eval
将作为源显示)结果的结果。它不会打印别名,shell内置文件(如echo
)和可执行文件(是否为二进制文件)的源文件,并且我相信通常不会提供此信息。在正常执行过程中或响应信号时,某些命令可能会打印其源文件(甚至可能是真实的)。
__git_ps1
是在我的系统Arch Linux 中/usr/share/git/git-prompt.sh
及其/usr/share/git/completion/git-prompt.sh
上定义的,因此对您来说可能是相同的。
看一下“ 调用”部分man bash
是否需要查找专门在Shell开头提供的命令-它们可能会获取其他文件,而这些文件又会获取其他文件。
bash
吗?
$HOME/.bashrc
和in $HOME/.profile
。请参阅:linuxfromscratch.org/blfs/view/svn/postlfs/profile.html,其中解释了何时以及如何获取每个文件的一些详细信息。
/etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
,和的内容$ENV
和$BASH_ENV
需要被添加到列表中。
在中似乎没有可能bash
,但是在中zsh
:
$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh
find
/ locate
/ grep
。
~/.whatever
缺省情况下,zsh几乎可以肯定不会读取与bash 相同的文件,并且只会对共享位置中定义的函数(例如在这种情况下,未在其中重新定义)提供有用的答案~/.bashrc
。
你有尝试过吗?
grep -rnw '/path/to/somewhere/' -e "pattern"
或此处找到的任何其他命令:
看来我需要给您更多的解释。您的问题询问“”,因此,如果运行以下命令,它将返回定义了bash函数的所有文件。
grep -rnw 'Path2Search' -e "#!/bin/bash"
$PATH
,type
则将无法使用。您可能只想尝试使用find
或locate
。locate
它将更快,因为它使用了预先存在的数据库,但是如果该命令是最近才安装的,它将无法工作。