それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashの補完のcompgenでハイフン(ダッシュ/-)の引数を補完する

問題点

-list から -listDevice のようなcompletion が出来なくて、invalid option なっちゃう。

$ networksetup -list<TAB>
compgen 無効な引数です

キーワードの補完ができない。

ハイフンを付けた引数を補完するときは

compgen にハイフンをハイフン( -- )で渡してあげる。

compgen -W $list -- ${COMP_WORDS[COMP_CWORD]

-list -listdevice などのハイフンが入ったオプションを補完しようとすると、無効なオプション として compgen がwordとして compgen自身へのオプションとして持っていっちゃう

つまり

compgen -W ワードリスト -- '-list'

のようにしてあげないと、 -list から -listDevice のようなcompletion が出来なくて、invalid option なっちゃう。

compgen の使い方

compgen の使い方を見ておくと、次のようになっている。

compgen: compgen [-abcdefgjksuv] [-o option]
 [-A action] [-G globpat] [-W wordlist]  [-F function] 
[-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
    オプションに基づいた補完候補を表示します。

    シェル関数の中で補完候補を生成するために使用するように意図されています。
    オプション引数 WORD が与えられた場合、WORD に対して一致した候補が生成
    されます。

    終了ステータス:
    無効なオプションが与えられるかエラーが発生しない限り成功を返します

サンプル

-listXXXX が大量にあるコマンド補完する例です。

#!/usr/bin/env bash 

### 補完関数。
_takuya_networksetup (){
  curr="${COMP_WORDS[@]}"
  prev="${COMP_WORDS[$COMP_CWORD-1]}"
  cmd_name=networksetup

  if [[  $prev =~ $cmd_name ]] ; then 
      sub_command_list=$( networksetup -h | /usr/bin/grep networksetup | awk '{print $2}' )
      COMPREPLY=( $(compgen -W "$sub_command_list" -- ${COMP_WORDS[COMP_CWORD]}  ) ) 
    fi
}
complete -F _takuya_networksetup networksetup

参考商品

アタック Dash Button

アタック Dash Button