カスタムbashオートコンプリートがioリダイレクト(<および>)に影響を与えないようにする

カスタムbashオートコンプリートがioリダイレクト(<および>)に影響を与えないようにする

complete -W 'firstdatabase databasetwo etc' mysql私はコマンドを使用してデータベースを自動補完するためにデータベースのリストを保存しましたmysql

しかし、を入力する状況がたくさんあります。mysql db < /tmp/script.sql最初または?を見た後、>bashを既存のオートコンプリート(ファイル名)に戻すにはどうすればよいですか?<


修正する:Ubuntuインストーラをダウンロードしましたが、付属しています。バッシュオートコンプリートプリインストールされたパッケージ。単にサーバーに同じパッケージをインストールすることは私にとってオプションではありcomplete -pませんがdeclare。 (alias -p素敵なものもあります)

私たちのサーバーでは、を使用しましたcomplete -d cd。同じ問題が発生しました。その後も機能が持続することを発見しました<。しかし、>complete -dバッシュオートコンプリートこの問題を解決するより洗練された方法があります。彼らがそれをどのように解決したか(そして他の多くのコマンドも)見れば、cd私が経験したのと同じ問題を解決する方法を示すことができますmysql

これが彼らの実装ですcd。彼らは を使用し、complete -o nospace -F _cd cdデフォルトで_cdクエリをオートコンプリートする関数を呼び出します。これが彼らが使用する機能です:

_cd ()
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then
        _filedir -d;
        return 0;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories && echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $( compgen -d $i/$cur );
        do
            if [[ ( -n $mark_symdirs && -h $j || -n $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
        i=${COMPREPLY[0]};
        if [[ "$i" == "$cur" && $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return 0
}

complete -o nospace -F _cd cd

最新バージョンで上記のコードを実行すると、目的のbash結果が得られますcd。今どのように変換しますかmysql? (または私が一般的に使用するものcomplete -W?)

ベストアンサー1

魔法は_init_completion次の定義にあります。bash_completionbash-completionパッケージ用のファイル

簡単な脱出口はありません。 Bashで合理的な高度な仕上げをしたい場合は、bash-completionパッケージをインストールしてください。次に関数を定義します。

. /etc/bash_completion
_my_mysql () {
  local cur prev words cword
  _init_completion || return
  COMPREPLY=($(compgen -W 'firstdatabase databasetwo etc' "$cur"))
}
complete -F _my_mysql mysql

おすすめ記事