1

私のbashrcで。次のようにコマンドを完全にバッシュしようとしてscpいます

function _scp_complete
{
  COMPREPLY=""
  COMPREPLY+=( $(cat ~/.ssh_complete ) )
  COMPREPLY+=( $( find . ! -name . -prune -type f ) )
}
complete -F _scp_complete scp

アイデアは、押すscp [tab]と、現在のディレクトリ内のすべてのファイルと、テキスト ファイルにリストされている単語が表示されるということです~/.ssh_complete。このファイルに次のエントリが含まれているとします。

アレックス@192.0.0.1 アレックス@192.0.0.2

望ましい動作は次のとおりですscp alex@[TAB]。入力してタブ補完すると、scp alex@192.0.0 へのコマンドが「完了」します。alex@ で始まる可能な引数は 2 つしかないため (現在の作業ディレクトリに同様の名前のファイルがないと仮定します)。

>scp alex@[TAB]
  alex@192.0.0.1 alex@192.0.0.1 
>scp alex@192.0.0.

説明した実装で得られる動作は次のとおりです。入力scp alex@[TAB]すると、タブ補完は何も完了しませが、コマンドの下にすべての可能な引数をリストします。

>scp alex@[TAB]
  alex@192.0.0.1 alex@192.0.0.1 file1 Music Pictures ./.emacs <ALL files in the current directory>
>scp alex@

関数を修正して目的の動作を得るにはどうすればよいですか?

4

1 に答える 1

1

COMP_WORDS入力された現在の単語を取得するには、配列を使用する必要があります。次に、compgenコマンドを使用して、元の単語リストに基づいて可能な補完を生成します。

次のことを試してください。

_scp_complete()
{
  local cur=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -W "$(< ~/.ssh_complete) $( find . ! -name . -prune -type f )" -- $cur) )
}
complete -F _scp_complete scp

詳細については、このブログ投稿をご覧ください:独自のBash完了関数の作成

この補完は、名前にスペースが含まれているファイルでは機能しないことに注意してください。

また、の代わりに、ファイルからテキストを抽出する$(cat file)ために使用する方が効率的であることに注意してください。$(< file)

于 2013-02-06T09:06:32.143 に答える