2013-07-03 81 views
3

我經常寫這樣的事情:命令包和完成

cp -r folder-0.0.1 ~/temp 
cp -r folder-0.2.2 ~/temp 
cp -r folder-1.0.0 ~/temp 

模板:<comand> <name>-<version> <path>

但是,相反,我想這樣寫:

do_something 0.0.1 
do_something 0.2.2 
do_something 1.0.0 

模板:<alias> <version>

我可以在中輕鬆使用別名S'

我還想適當完成標籤鍵正常工作。我如何編程的完成來實現這個目標?

+0

關閉請求:問題也是關於編程完成! –

回答

4

Not with aliases.

do_something() { 
    cp -r folder-"$1" ~/temp 
} 
+0

好的,但我有一個標籤+選項卡自動完成的麻煩。 當我使用標籤+標籤Bash寫入文件夾 - so_something後。當我這樣做時,它看起來像文件夾 - 。它可以修復嗎? –

+0

bash write = bash建議在這種情況下寫入。 –

+0

當然。修改自動完成功能。不,我不知道如何。 –

1

正如伊格納西奧巴斯克斯 - 艾布拉姆斯已經提到,不使用別名。實際上,它甚至寫在Aliases section of the reference manual

對於幾乎所有目的,shell函數都優於別名。

所以你需要一個功能:

do_something() { 
    [[ -n $1 ]] && cp -rnvt ~/test folder-"$1" 
} 

如果你不喜歡我寫的cp其所有的選項的方式,只是將其刪除。對於信息:

  • -n以便不覆蓋現有文件/文件夾
  • -v,以便詳細
  • 該目錄下面-t是目標目錄

(我喜歡請寫下我的cp,你的cp版本可能無法處理,但很可能)。

還有一個檢查,以確保在啓動cp之前給出參數。

到目前爲止沒有比其他答案更好的了。關於完成,這裏是你可以做什麼:

_do_something() { 
    COMPREPLY=($(
     shopt -s nullglob extglob 
     files=(folder-+([[:digit:].])/) 
     for ((i=0;i<${#files[@]};++i)); do 
      files[i]=${files[i]#folder-} 
      files[i]=${files[i]%/} 
     done 
     compgen -W "${files[*]}" -- "${COMP_WORDS[COMP_CWORD]}" 
    )) 
    return 0 
} 

complete -F _do_something do_something 

將這個在您的.bashrc(即使它可能不是完井最好的地方,你會調整這一切,當你經驗更豐富)和享受!

從這裏開始,你會想要擴展它,直到它變成100000行精彩的腳本。例如我在cp中加入-n選項(我相信這是一個很酷的安全功能)。然後,您可以將選項添加到do_something功能,例如選項--force將刪除此-n選項。我不會爲你做這件事(它超出了這個答案的範圍),但這並不難。然後確保您也相應地更改完成功能!其樂無窮。