私はいくつかのシンボリックリンクを管理するのに役立つBashスクリプトを書いています。一部の包装紙です拾って入れる注文する。
呼び出し時に、コマンド(plug
// )unplug
とreplug
ディレクトリ名(パスではなくデフォルト名のみ)という2つのコマンドライン引数を渡します。
スクリプトが呼び出されるので、vlink
呼び出しは次のようになります。
vlink plug foo
ディレクトリ名(foo
上記の例では)は、システム内の特定のディレクトリのサブディレクトリの1つでなければなりません。
plug
3番目の引数には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番目の引数の場合、関連ディレクトリに一致するディレクトリ名が生成されます。