bash的自動完成功能很爽,它不知道免掉我多少記憶的負擔,節約了多少鍵盤操作。 但是對於我們自己寫的指令碼也能夠利用它的自動完成功能嗎?回答是肯定的。下面以幾個例子來說明。
程式設計師需要記憶很多東西,bash, vi, screen, svn都有很多命令和快捷鍵,偏偏我的記憶力不行,不時檢視cheatsheet,每次都cd到某個目錄,從一大堆檔案中找到那個檔案,然後再開啟,這個過程顯然很煩瑣。所以我寫了乙個指令碼,叫做quickref,它接收乙個引數,例如bash, vi,然後就會開啟對應的cheatsheet。
quickref:
#!/bin/bash
case $1 in
bash)
exo-open ~/dropbox/cheatsheets/bash/bash_cheat_sheet.pdf
;;vi)
exo-open ~/dropbox/cheatsheets/vi_cheat_sheet.pdf
;;# more...
esac
exo-open是xubuntu下的命令,它自動用檔案關聯的應用程式開啟, 例如, pdf檔案就會用evince開啟。ubuntu下對應的命令是gnome-open。
如果只有bash, vi的cheatsheet,一切不成問題,但是當列表越來越長,問題就來,你不知道你的命令能夠接受哪些引數,輸入命令時你得考慮,我該輸入什麼呢?可能還得來回折騰幾次,最壞的情況,你可能需要檢視源**才能確定你到底能輸入什麼。你可以將它們顯示在出錯訊息中,這樣可以節省一些功夫,但總不太好。我們可以利用bash的自動完成功能,我不再擔心會輸入錯誤。
我們直接來看怎麼做,建立乙個檔案quickref_completion, 輸入以下內容:
_quickref_completion()
compreply=($( compgen -w 'bash vi' -- $cur ))
return 0
}complete -f _quickref_completion quickref
然後執行命令". quickref_complection",然後再在bash下輸入"quickref ",然後再按tab(或許得按兩次tab),你會發現bash自動列出所有匹配的結果,下面是我的機器上的顯示結果:
$ quickref
bash vi
$ quickref
怎麼實現的呢?其實很簡單,_quickref_completion函式用來完成主要的功能,前三行用來得到使用者當前的輸入,全部補全的結果放在compreply陣列中。這裡補全的功能由compgen命令來完成,它完成的功能就是從單詞列表中選出匹配給定字首的所有單詞,你最後在命令列下測試一下:
$ compgen -w "find fine hello"
find
fine
hello
$ compgen -w "find fine hello" fi
find
fine
最後complete命令用來註冊自動補全函式,第乙個引數就是自動補全的函式,後面的引數是應用這個補全函式的所有命令。執行quickref_completion的操作最好放在bashrc中去。
再乙個例子,我經常用到命令"sudo apt-get install"命令,所以我給它定義了乙個別名:"alias pkginstall='sudo apt-get install'",但這樣不好的是,你不能再利用apt-get install的自動完成功能。另外我也定義了別名"alias pkgremove='sudo apt-get remove", 我為它們寫了自動補全的函式:
_pkginstall_completion()
compreply=( $( apt-cache pkgnames -- $cur ) )
}complete -f _pkginstall_completion pkginstall
_pkgremove_completion()
compreply=( $( dpkg -l | awk '' | grep "^$" ) )
}complete -f _pkgremove_completion pkgremove
**就不再解釋了,很簡單,至於用到的命令,不熟悉的在命令列下試試就知道了。
當然這裡所介紹的只是十分簡單,但於我已經夠用了,至少到目前為止是這樣。但要完成更加複雜的功能,例如對於不同的選項,使用不同的命令完成,例如apt-get install和apt-get remove的自動補全就不一樣,你可能需要參考其它文章。/etc/complete.d/目錄下有很多補全函式的實現,你可以拿來看一下。也可能參考官方文章[url=
新增 Bash 自定義命令
alias 命令簡單來說,就是將一些複雜繁瑣的命令,簡化成自定義的命令。語法如下 舉個例子 在 bash 中清屏的命令是clear,如果我想用clr去代替,那麼我就寫alias clr clear 這時用alias可以看到剛才新增的自定義命令clr clear 執行clr,成功清屏了,意味著命令執行...
自定義自動增長列
在論壇中看到的 在學習中遇到這個問題 資料庫裡有編號字段 bh00001 bh00002 bh00003 bh00004 如何實現自動增長 下面的 生成長度為8的編號,編號以bh開頭,其餘6位為流水號。得到新編號的函式 create function f nextbh returns char 8 ...
自定義view 文字自動換行
protected void ondraw canvas canvas 自動分割文字 param content 需要分割的文字 param p 畫筆,用來根據字型測量文字的寬度 param width 最大的可顯示畫素 一般為控制項的寬度 return 乙個字串陣列,儲存每行的文字 private...