bash_completion
私のスクリプトのルールを作成しようとしていますrmpxe
。スクリプトは<hostname>
これを唯一のパラメータとして使用します。次に、対応するホスト名を確認し、対応する<ip_address>
シンボリックリンクを削除します/srv/tftp/pxelinux.cfg/<ip_address>
。
<ip_address>
シンボリックリンクのIPアドレス/srv/tftp/pxelinux.cfg/<ip_address>
は16進形式ですが、getnameinfo
この16進IPアドレスをホスト名に解析する単純なプログラムをC()で作成しました。
したがって、私のプログラムを使用してgetnameinfo
16進IPからホスト名を取得できます。
$ getnameinfo 0A6F010B
server1.mydomain.com
たとえば、次のコマンドはシンボリックリンクを削除します。/srv/tftp/pxelinux.cfg/0A6F010B
$ rmpxe server1.mydomain.com
今私のbash_completion
問題は次のとおりです。次のコードを作成し、ホスト名を完成させるのではなく(私のスクリプトが期待するように)16進IPアドレス(たとえば、私のディレクトリシンボリックリンクファイル内のアドレス)を/srv/tftp/pxelinux.cfg/
完成させる以外はうまくいきます。パラメータがオートコンプリートされる前に、まずホスト名を解決するためにこのコードに組み込む必要があります。
_rmpxe()
{
local word
COMPREPLY=()
if [ 1 -eq "$COMP_CWORD" ]; then
pushd /srv/tftp/pxelinux.cfg &>/dev/null || return 1
word="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=($(compgen -f "$word"))
popd &>/dev/null
fi
}
complete -F _rmpxe rmpxe
つまり、現在のbash完了操作は次のようになります。
$ ls /srv/tftp/pxelinux.cfg
0A6F010B 0A6F010C 0A6F010D 0A6F010E
$ rmpxe <tab>
0A6F010B 0A6F010C 0A6F010D 0A6F010E
ただし、次のように動作するために必要です。
$ rmpxe <tab>
server1.mydomain.com server2.mydomain.com server3.mydomain.com
答え1
を使用したため、現在のパスの下のすべてのファイルとディレクトリが一覧表示されますcompgen -f
。compgen
あなたの場合これは0A6F010B 0A6F010C 0A6F010D 0A6F010E
。
ホスト名を取得するには、現在のパスを繰り返し、各IPを供給してgetnameinfo
そのIPに対応するホスト名を取得し、それを配列に保存してからこの配列を使用できますcompgen -W
。
私の環境で簡単なテストをしてみました。ファイルを作成しました/etc/bash_completion.d/cuonglm
。
_rmpxe() {
local word
COMPREPLY=()
if [ 1 -eq "$COMP_CWORD" ]; then
pushd /home/cuonglm/test &>/dev/null || return 1
word="${COMP_WORDS[COMP_CWORD]}"
HOST_ARR=()
for i in *; do
HOST_ARR+=($(/home/cuonglm/getnameinfo "$i"))
done
COMPREPLY=($(compgen -W "$(printf "%s " "${HOST_ARR[@]}")" -- "$word"))
popd &>/dev/null
fi
}
complete -F _rmpxe cuonglm
いくつかの修正を経て、フル機能を使用しました。
- ホスト名を保存するために配列を使用しています
HOST_ARR
。 - 現在のディレクトリを繰り返しながら(
pushd
以前に感謝します)、各ファイル名をgetnameinfo
プログラムに入力します。 - その後、compgenを使用して
compgen -W
完成する単語のリストを作成しました。
結果は次のとおりです。
$ cuonglm <Tab>
$ cuonglm server<Tab>
server1.example.com server2.example.com
どちらのホスト名も同じ部分を持つため、server
bashは自動的にこの部分を最初に完了します。別のホスト名がある場合Server.example
:
$ cuonglm <Tab>
Server.example server1.example.com server2.example.com