如何在Linux/Unix上找到bash shell函数源代码

时间:2020-01-09 10:39:11  来源:igfitidea点击:

如何找出已定义的名为foo()的bash函数的源代码。
如何找到定义bash函数的文件,以及如何从shell提示符本身查看foo()的源代码?
要找到函数定义,即从bash shell中获取foo()的源代码,请运行:

type -a function_name_here
type -a foo

输出示例:

foo is a function
foo () 
{ 
    local l="";
    [[ $l == "" ]] && /usr/bin/lxc exec vm -- /root/bin/uploads on;
    /usr/bin/lxc exec vm -- /bin/bash;
    [[ $l == "" ]] || return 0;
    wait;
    /usr/bin/lxc exec vm -- /root/bin/uploads off;
    sudo -i /root/bin/master.replication -v;
}

要列出所有函数名称,请执行:

$ declare -F
$ declare -F | grep function_name
$ declare -F | grep foo

输出示例:

declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __git_eread
declare -f __git_ps1
declare -f __git_ps1_colorize_gitstring
declare -f __git_ps1_show_upstream
declare -f __grub_dir
declare -f __grub_get_last_option
declare -f __grub_get_options_from_help
declare -f __grub_get_options_from_usage
declare -f __grub_list_menuentries
declare -f __grub_list_modules
declare -f __grubcomp
declare -f __ltrim_colon_completions
declare -f __parse_options
declare -f __reassemble_comp_words_by_ref
declare -f _allowed_groups
declare -f _allowed_users
declare -f _available_interfaces
declare -f _cd
....
..
...
declare -f _uids
declare -f _upvar
declare -f _upvars
declare -f _usb_ids
declare -f _user_at_host
declare -f _usergroup
declare -f _userland
declare -f _variables
declare -f _xfunc
declare -f _xinetd_services
declare -f cbz_wp_admin
declare -f command_not_found_handle
declare -f del_all_mem_cache
declare -f dequote
declare -f quote
declare -f quote_readline

要查看see quote()定义:

$ declare -f quote

输出示例:

quote () 
{ 
    local quoted=${1//\'/\'\\'\'};
    printf "'%s'" "$quoted"
}

如何找到定义了bash函数的文件?

语法如下:

$ shopt -s extdebug
$ declare -F quote
`quote 143 /usr/share/bash-completion/bash_completion`
$ declare -F cbz_wp_admin
`cbz_wp_admin 14 /home/Hyman/.bash_aliases`

quote()是在143行定义的/usr/share/bash-completion/bash_completion文件。
与第14行/home/Hyman/.bash_aliases中定义的cbz_wp_admin()相同。
您也可以按以下方式启动它:

$ bash --debugger
$ declare -F function_name()
$ declare -F cbz_wp_admin