2013-08-16 41 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 

到目前爲止,這對於用適當的數據庫和文件完成第一個和第二個條目非常有用。不過,我一直試圖添加一種方法來簡單地打印出「Usage」信息,如果您在文件的任何位置雙擊製表符。所以,如果我把到控制檯這樣的:

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(shell提示符)和當前的單詞來修復損壞的新行。我們可以將$actualPS1的內容直接粘貼在我們的回聲中,但我認爲這種方法更清晰易讀。

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

這將爲您的特定情況打印一行文字,然後將控制檯正確地返回給您。沒有必要指定COMPREPLY應該是什麼。

請注意,您基本上可以將此完成添加到無法通過常規方式完成的任何事情中作爲最終用戶的有用提醒。一種可能使用這種方法的方法是echo本身!