bashで、現在読み込まれているfunctionの一覧とその内容(コード)を、ターミナルからbashrc等を読まないで確認したい時がある。 調べたところ、以下のような方法で確認できるようだ。

1. setで調べる

単純に、全部のfunctionとその内容を見るだけであれば、setコマンドをオプションなしで実行してやればいい。 function以外も出力されてしまうが、読み込まれているfunctionとそのコードが出力される。

blacknon@test-ubuntu18:~$ set
BASH=/bin/bash
...
quote ()
{
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

2. compgenやdeclare(typeset)で調べる

単純に設定されているfunction等はsetで見れることは確認できたが、これだとちょっと見にくい。 functionの一覧を出力して、必要だったらその中身を見るようにしたい場合は、compgenやdeclare(aliasでtypesetが設定されてる場合もある様子)など、いくつか手段があるようだ。

functionの一覧を出力する場合は以下。

compgen -A function
declare -F
typeset -F
blacknon@test-ubuntu18:~$ compgen -A function
__expand_tilde_by_ref
__get_cword_at_cursor_by_ref
__git_eread
__git_ps1
__git_ps1_colorize_gitstring
...
blacknon@test-ubuntu18:~$ declare -F
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
...

functionの内容を確認する場合は以下。

declare -f <function名>
typeset -f <function名>
blacknon@test-ubuntu18:~$ declare -f quote
quote ()
{
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
blacknon@test-ubuntu18:~$ typeset -f quote
quote ()
{
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

通常であれば読み込んでる.bashrc等をみればいいだけなのだけど、前に書いた ローカルのbashrcを使ってssh接続する方法 だとファイルが存在しないので利用できない。 そのような状態でも、この方法でfunctionの内容を調べることができる。