web-dev-qa-db-ja.com

特定のコマンドにカスタムオートコンプリートを指定するにはどうすればよいですか?

タブをダブルクリックしたときに何を表示するかをbashに正確に知らせる方法はありますか?たとえば、私はpython script scpyを持っています。これには、いくつかの引数が必要です。たとえば、apt-get、ダブルタブを使用すると

 autoclean build-dep clean dselect-upgrade purge source upgrade 
 autoremove check dist-upgrade install remove update 

あなた自身のスクリプト/プログラムのためにそれを行う方法はありますか? pythonスクリプトをbashスクリプトでラップする必要がありますか?

28
Falmarri

これを行う最も簡単な方法は、/etc/bash_completion.d/にシェルスクリプトを含めることです。このファイルの基本構造は、bashビルトインであるcompleteの完了と呼び出しを実行する単純な関数です。 completeの使用方法について詳しく説明するのではなく、 Bash補完の概要 を読むことをお勧めします。パート1では基本を説明し、パート2では補完スクリプトの記述方法を説明します。

Bash補完のより詳細な説明は、man bashの[Programmable Completion]セクションにあります(「/ Programmable Completion」と入力してから、 'n'を数回押すと、そこにすばやく到達できます。または、幸運を感じる、「g 2140 RETURN」)。

32
Steven D

こちらが基本ガイドです。

オートコンプリートを機能させたいadmin.shというスクリプトの例を見てみましょう。

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

オプション候補リストに注意してください。このオプションを使用してスクリプトを呼び出すと、このスクリプトのすべての可能なオプションが出力されます。

そして、ここにオートコンプリートスクリプトがあります。

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur prev
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

完了する最後の引数は、オートコンプリートを追加するスクリプトの名前です。オートコンプリートスクリプトをbashrcに追加するだけで、

source /path/to/your/autocomplete.sh

または/etc/bash.completion.dにコピーします

出典: https://askubuntu.com/a/483149/24155

9
Eduardo Cuomo