自定義Bash自動完成

2021-08-30 17:03:43 字數 2452 閱讀 7218

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...