2013-08-16 4 views
2

난 당신이 옵션없이 실행하면 그 사용법을 설명하는 방법이 있습니다해킹 도움 스타일 정보

Usage: 
SQLbatch [database] [file] [maximum # of lines in batch] [time to sleep between batches] [who to email when finished] 

을 최근에, 나는 나의 여가 시간에 탭 완성 스크립트를 작성했습니다를 :

_SQLbatch() 
{  

    local cur dbs 
    COMPREPLY=() 
    dbs=$(< /...directory paths.../allDbs.txt) 
    cur="${COMP_WORDS[COMP_CWORD]}" 

    case "$COMP_CWORD" in 
    1) 
    case "$cur" in 
    *@*) 
     COMPREPLY=($(compgen -W "$dbs" -- "$cur" | sed -e "s/.*@/@/")) 
     return 0  
     ;;   
    *) 
     COMPREPLY=($(compgen -W "$dbs" -- "$cur")) 
     return 0  
     ;;   
    esac 
    ;;  
    2) 
    COMPREPLY=($(compgen -f -- "$cur")) 
    return 0 
    ;;  
    *) 
    esac 
}  

complete -F _SQLbatch SQLbatch 

지금까지는 적절한 데이터베이스와 파일로 첫 번째와 두 번째 항목을 완성하는 데 적합합니다. 그러나 필자는 파일을 두 번 탭하면 "사용"정보를 단순히 인쇄하는 방법을 추가하려고했습니다. 내가 콘솔에 이것을 넣어한다면, :.

: 나는 그들이 이미에 입력 한 내용을 파괴하지 않고 필요한 다른 어떤 사용자를 상기시켜 완성하고 싶습니다

SQLbatch [email protected] file.txt [TAB][TAB] 

내 최신 방법은 다음과 같이이었다

... 
    *) 
    echo -e "\nSQLbatch [database] [file] [maximum # of lines in batch] [time to sleep between batches] [who to email when finished]" 
    return 0 
    ;; 
    esac 
... 

거의이지만 궁극적으로 최신 입력란에 사용자 입력을 다시 표시하지 못합니다. 이 마지막 단계를 완료하도록하는 방법이 있습니까?

답변

1

다음은 어떻게 사용하나요? 우리가 할 일은 PS1 (셸 프롬프트)과 깨진 새 줄을 수리하기위한 현재 단어를 생성하는 것입니다. $actualPS1의 내용을 직접 echo 명령에 넣을 수는 있지만이 방법이 훨씬 더 읽기 쉽다고 생각했습니다.

... 
*) 
    actualPS1=$(eval echo \"$PS1\") 
    echo -en "\nWhatever line of text you want.\n" 
    echo -en "${actualPS1}${COMP_WORDS[@]}" 
    return 0 
    ;; 
esac 
... 

그러면 특정 사례에 대한 텍스트 줄이 인쇄 된 다음 적절하게 다시 제공됩니다. COMPREPLY를 지정해야 할 필요는 없습니다.

기본적으로이 완료는 최종 사용자에게 유용한 알림으로 정상적인 방법으로 완료 할 수없는 항목에 추가 할 수 있습니다. 잠재적으로 이것을 사용할 수있는 한 가지 방법은 echo입니다.