사용자 정의 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

관련 정보