compgenコマンドはbashの組み込みコマンドでcompleteコマンドの設定によって表示される補完の候補を標準出力し確認することができます。オプションについてはcompleteコマンドと同じオプションになり、completeコマンドの補完するリストを確認したり、completeコマンドの-Fオプションの関数で利用します。
compgenコマンドはcompleteコマンドとは違い、引数に入力中の補完候補の単語を取ることで、リストされる補完候補から候補を絞ることができます。
compgenコマンドの-Aオプションにある補完候補からユーザ名、コマンドや変数などを確認できるのも便利かもしれません。
補完候補を絞る
compgenコマンドは引数に入力中の補完候補がある場合、補完候補が絞られます。
例えば、compgenコマンドでシグナル名の表示を確認すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
$compgen -A signal EXIT SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABRT SIGBUS SIGFPE SIGKILL SIGUSR1 SIGSEGV SIGUSR2 SIGPIPE SIGALRM SIGTERM SIGSTKFLT SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGXCPU SIGXFSZ SIGVTALRM SIGPROF SIGWINCH SIGIO SIGPWR SIGSYS SIGJUNK(32) SIGJUNK(33) SIGRTMIN SIGRTMIN+1 SIGRTMIN+2 SIGRTMIN+3 SIGRTMIN+4 SIGRTMIN+5 SIGRTMIN+6 SIGRTMIN+7 SIGRTMIN+8 SIGRTMIN+9 SIGRTMIN+10 SIGRTMIN+11 SIGRTMIN+12 SIGRTMIN+13 SIGRTMIN+14 SIGRTMIN+15 SIGRTMAX-14 SIGRTMAX-13 SIGRTMAX-12 SIGRTMAX-11 SIGRTMAX-10 SIGRTMAX-9 SIGRTMAX-8 SIGRTMAX-7 SIGRTMAX-6 SIGRTMAX-5 SIGRTMAX-4 SIGRTMAX-3 SIGRTMAX-2 SIGRTMAX-1 SIGRTMAX DEBUG ERR RETURN |
のように表示されます。ここで、'SIGI'までの文字列を引数にすると、
1 2 3 4 |
$compgen -A signal SIGI SIGINT SIGILL SIGIO |
のように、候補を絞ることができます。
パターンの決まっている補完候補リストを表示
(-Aオプション)
-Aオプションはアクションを指定して、パターンの決まっている補完候補のリストを表示できます。表示できる補完候補リストの種類は以下のようになります。アクションの種類にあるものを簡易的に確認するのにcompgenコマンドを利用してみても良いかもしれません。
アクションの種類
アクション | 意味 | オプション |
alias | エイリアス(別名) | -a |
arrayvar | 配列変数 | |
binding | Readlineのキー・バインド名 | |
builtin | 組み込みコマンド | -b |
command | コマンド | -c |
directory | ディレクトリ名 | -d |
disabled | 無効な組み込みコマンド | |
enabled | 有効な組み込みコマンド | |
export | 環境変数 | -e |
file | ファイル名 | -f |
function | シェルの関数名 | |
group | グループ名 | -g |
helptopic | helpコマンドでのトピック | |
hostname | ホスト名 (変数HOSTFILEの内容や/etc/hostsが参照) |
|
job | ジョブ名 | -j |
keyword | シェルの予約語 | -k |
running | 動作中のジョブ名 | |
service | サービス名 | -s |
setopt | setコマンドの-oオプションの引数 | |
shopt | shoptコマンドのオプション名 | |
signal | シグナル名 | |
stopped | 停止中のジョブ名 | |
user | ユーザ名 | -u |
variable | シェルの変数名 | -v |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$compgen -a alert egrep fgrep grep l la ll ls $ $alias alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l='ls -CF' alias la='ls -A' alias ll='ls -alF' alias ls='ls --color=auto' |
関数でcompgenコマンドを利用する
completeコマンドで利用する関数を作成する際、compgenコマンドを利用すると、補完候補を絞っていくような実装を行うことができます。
そのような実装を行う場合、引数にcompleteコマンドで渡される第2引数(補完中の単語)をcompgenコマンドに渡します。
func.sh
1 2 3 4 |
_echo () { COMPREPLY=($(compgen -A builtin -- "$2")) } |
コマンド例と補完結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$source func.sh $complete -F _echo echo $echo . cd echo getopts mapfile set type : command enable hash popd shift typeset [ compgen eval help printf shopt ulimit alias complete exec history pushd source umask bg compopt exit jobs pwd suspend unalias bind continue export kill read test unset break declare false let readarray times wait builtin dirs fc local readonly trap caller disown fg logout return true $echo h hash help history |
また、bash-completionがインストールされているなら、_init_completion関数を利用すると補完の関数を作成するのに便利です。_init_completionを利用する際は変数cur・prev・words・cwordをローカル宣言してから利用します。
func2.sh
1 2 3 4 5 6 7 |
_echo2 () { local cur prev words cword _init_completion || return; COMPREPLY=($(compgen -A builtin -- "$cur")) } |
コマンド例と補完結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$source func2.sh $complete -F _echo2 echo $echo . cd echo getopts mapfile set type : command enable hash popd shift typeset [ compgen eval help printf shopt ulimit alias complete exec history pushd source umask bg compopt exit jobs pwd suspend unalias bind continue export kill read test unset break declare false let readarray times wait builtin dirs fc local readonly trap caller disown fg logout return true $echo h hash help history |
変数prevには補完中の単語のひとつ前の単語が、
配列変数wordsにはコマンドを含めた最初の単語を0としたそれぞれの単語が、
変数cwordには単語の合計数(補完中の単語は含めない)が入ります。