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_completion
bash-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