ディレクトリローカルの実行可能ファイルにBashの補完を提供する方法は?

ディレクトリローカルの実行可能ファイルにBashの補完を提供する方法は?

私はいくつかのシンボリックリンクを管理するのに役立つBashスクリプトを書いています。一部の包装紙です拾って入れる注文する。

呼び出し時に、コマンド(plug// )unplugreplugディレクトリ名(パスではなくデフォルト名のみ)という2つのコマンドライン引数を渡します。

スクリプトが呼び出されるので、vlink呼び出しは次のようになります。

vlink plug foo

ディレクトリ名(foo上記の例では)は、システム内の特定のディレクトリのサブディレクトリの1つでなければなりません。

plug3番目の引数には3つの可能なコマンド(/ unplug/)と可能な特定のディレクトリ名のセットしかないので、いくつかのreplugタブ補完機能を提供したいと思います。

私はBash完成スクリプトの作成にある程度慣れています。しかし、私の$ PATHにはなく、親ディレクトリでのみ実行するように意図された実行可能ファイルの完成コマンドを提供する方法はありますか?

答え1

これはうまくいくかもしれません:

_vlink () {
    case $COMP_CWORD in
        1) COMPREPLY=( $(compgen -W "plug unplug replug" "$2") ) ;;
        2) local IFS=$'\n'
            COMPREPLY=( $(cd /some/dir && compgen -d "$2") ) ;;
    esac
}

complete -F _vlink vlink

/some/dir興味のあるサブディレクトリを含むディレクトリに置き換えます。 (ディレクトリ名に改行文字がないとします。)

  • COMP_CWORD完成する単語のインデックスです(0はコマンド名)。
  • 補完関数の2番目の引数は完成する単語です(1番目はコマンド名、3番目は前の単語)。

だから私たちは以下を使用しますcompgen

  • -W最初の引数の場合、提供された単語のリストから一致する単語を生成し、
  • 2番目の引数の場合、関連ディレクトリに一致するディレクトリ名が生成されます。

関連情報