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