亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

Shell腳本中實現自動補全功能

2024-06-28 13:27:07
字體:
來源:轉載
供稿:網友
Shell腳本中實現自動補全功能

對于linuxer來說,自動補全是再熟悉不過的一個功能了。當你在命令行敲下部分的命令時,肯定會本能地按下Tab鍵補全完整的命令,當然除了命令補全之外,還有文件名補全。

Bash-completion

自動補全這個功能是Bash自帶的,但一般我們會安裝bash-completion包來得到更好的補全效果,這個包提供了一些現成的命令補全腳本,一些基礎的函數方便編寫補全腳本,還有一個基本的配置腳本。但也正如之前說的,這個包不是必須的,只不過可以省些力氣。

bash-completion這個包的安裝位置因不同的發行版會有所區別,但是大致上啟用的原理是類似的,一般會有一個名為bash_completion的腳本,這個腳本會在shell初始化時加載。例如對于RHEL系統來說,這個腳本位于/etc/bash_completion,而該腳本會由/etc/PRofile.d/bash_completion.sh中導入:

 1 # Check for interactive bash and that we haven't already been sourced. 2 [ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION" ] && return 3  4 # Check for recent enough version of bash. 5 bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.} 6 if [ $bmajor -gt 3 ] || [ $bmajor -eq 3 -a $bminor -ge 2 ]; then 7     if shopt -q progcomp && [ -r /etc/bash_completion ]; then 8         # Source completion code. 9         . /etc/bash_completion10     fi11 fi12 unset bash bmajor bminor

而在bash_completion腳本中會加載/etc/bash_completion.d下面的補全腳本:

if [[ $BASH_COMPLETION_DIR != $BASH_COMPLETION_COMPAT_DIR && /    -d $BASH_COMPLETION_DIR && -r $BASH_COMPLETION_DIR && /    -x $BASH_COMPLETION_DIR ]]; then    for i in $(LC_ALL=C command ls "$BASH_COMPLETION_DIR"); do        i=$BASH_COMPLETION_DIR/$i        [[ ${i##*/} != @(*~|*.bak|*.swp|/#*/#|*.dpkg*|*.rpm@(orig|new|save)|Makefile*) /            && -f $i && -r $i ]] && . "$i"    donefiunset i

補全腳本的名稱一般就是命令名,這樣比較容易查找:

$ ls i*iconv  iftop  ifupdown  info  iproute2  iptables

內置補全命令

Bash內置有兩個補全命令,分別是compgencompletecompgen命令根據不同的參數,生成匹配單詞的候選補全列表,例如:

$ compgen -W 'hi hello how world' hhihellohow

compgen最常用的選項是-W,通過-W參數指定空格分隔的單詞列表。h即我們在命令行當前鍵入的單詞,執行完后會輸出候選的匹配列表,這里是以h開頭的所有單詞。

complete命令的參數有點類似compgen,不過它的作用是說明命令如何進行補全,例如同樣使用-W參數指定候選的單詞列表:

$ complete -W 'Word1 word2 word3 hello' foo$ foo w<Tab>$ foo word<Tab>word1  word2  word3

我們還可以通過-F參數指定一個補全函數:

$ complete -F _foo foo

現在鍵入foo命令后,會調用_foo函數來生成補全的列表,完成補全的功能,這一點正是補全腳本實現的關鍵所在,我們會在后面介紹。

補全相關的內置變量

除了上面的兩個補全命令外,Bash還有幾個內置的變量用來輔助補全功能,這里主要介紹其中三個:

  • COMP_WORDS: 類型為數組,存放當前命令行中輸入的所有單詞;
  • COMP_CWORD: 類型為整數,當前光標下輸入的單詞位于COMP_WORDS數組中的索引;
  • COMPREPLY: 類型為數組,候選的補全結果;
  • COMP_WORDBREAKS: 類型為字符串,表示單詞之間的分隔符;
  • COMP_LINE: 類型為字符串,表示當前的命令行輸入;

例如我們定義這樣一個補全函數_foo:

$ function _foo(){     echo -e "/n"     declare -p COMP_WORDS    declare -p COMP_CWORD     declare -p COMP_LINE     declare -p COMP_WORDBREAKS}$ complete -F _foo foo

假設我們在命令行下輸入以下內容,再按下Tab鍵補全:

$ foo bdeclare -a COMP_WORDS='([0]="foo" [1]="b")'declare -- COMP_CWORD="1"declare -- COMP_LINE="foo b"declare -- COMP_WORDBREAKS="     

對著上面的結果,我想應該比較容易理解這幾個變量。當然正如我們之前據說,Bash-completion包并非是必須的,補全功能是Bash自帶的。

編寫腳本

補全腳本分成兩個部分:編寫一個補全函數和使用complete命令應用補全函數。后者的難度幾乎忽略不計,重點在如何寫好補全函數。難點在,似乎網上很少與此相關的文檔,但是事實上,Bash-completion自帶的補全腳本是最好的起點,可以挑幾個簡單的改改基本上就可以使用了。

一般補全函數(假設這里依然為_foo)都會定義以下兩個變量:

local cur prev

其中cur表示當前光標下的單詞,而prev則對應上一個單詞:

cur="${COMP_WORDS[COMP_CWORD]}"prev="${COMP_WORDS[COMP_CWORD-1]}"

初始化相應的變量后,我們需要定義補全行為,即輸入什么的情況下補全什么內容,例如當輸入-開頭的選項的時候,我們將所有的選項作為候選的補全結果:

local opts="-h --help -f --file -o --output"if [[ ${cur} == -* ]] ; then        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )        return 0fi

不過再給COMPREPLY賦值之前,最好將它重置清空,避免被其它補全函數干擾。

現在完整的補全函數是這樣的:

function _foo() {    local cur prev opts    COMPREPLY=()    cur="${COMP_WORDS[COMP_CWORD]}"    prev="${COMP_WORDS[COMP_CWORD-1]}"    opts="-h --help -f --file -o --output"    if [[ ${cur} == -* ]] ; then        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )        return 0    fi}

現在在命令行下就可以對foo命令進行參數補全了:

$ complete -F _foo foo$ foo --f        --file    -h        --help    -o        --output

當然,似乎我們這里的例子沒有用到prev變量。用好prev變量可以讓補全的結果更加完整,例如當輸入--file之后,我們希望補全特殊的文件(假設以.sh結尾的文件):

case "${prev}" in    -f|--file)        COMPREPLY=( $(compgen -o filenames -W "`ls *.sh`" -- ${cur}) )        ;;esac

現在再執行foo命令,--file參數的值也可以補全了:

$ foo --file<Tab>a.sh b.sh c.sh

安裝補全腳本

如果安裝了Bash-completion包,可以將補全腳本放在/etc/bash_completion.d目錄下,或者放到~/.bash_completion文件中。如果沒有安裝Bash-completion包,可以把補全腳本放到~/.bashrc或者其它能被shell加載的初始化文件中。

原文地址 http://www.it165.net/os/html/201212/4208.html


上一篇:dpdk l2fwd

下一篇:段頁式存儲

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品视频在线播放| 久久久亚洲福利精品午夜| 超碰精品一区二区三区乱码| 国产精品一区二区三区久久| 日韩精品高清在线| 欧美在线影院在线视频| 亚洲品质视频自拍网| 韩国欧美亚洲国产| 欧美激情videoshd| 91性高湖久久久久久久久_久久99| 欧美另类交人妖| 色爱av美腿丝袜综合粉嫩av| 91在线中文字幕| 98视频在线噜噜噜国产| 亚洲综合在线小说| 国产精品欧美风情| 日本一区二区在线免费播放| 国产精品一二三视频| 欧美精品福利视频| 久久久久久久久久久免费精品| 中文字幕日韩电影| 欧美日韩一区二区在线播放| 欧美猛交免费看| 国产不卡在线观看| 中日韩美女免费视频网址在线观看| 亚洲欧美中文日韩在线v日本| 欧美性猛交xxxx乱大交| 国产91免费观看| 成人深夜直播免费观看| 91精品国产综合久久久久久蜜臀| 97久久超碰福利国产精品…| 91精品视频免费观看| 欧美另类99xxxxx| 在线视频中文亚洲| 亚洲综合一区二区不卡| 久久久最新网址| 91欧美激情另类亚洲| 久久99久国产精品黄毛片入口| 精品magnet| 国产一区二区黄| 成人情趣片在线观看免费| 成人激情视频小说免费下载| 亚洲一区二区在线播放| 国产精品视频内| 亚洲精品电影在线| 中文字幕视频在线免费欧美日韩综合在线看| 国产91精品久久久久久久| 日韩电影中文字幕一区| 国产精品老牛影院在线观看| 久热精品视频在线免费观看| 欧美一级片免费在线| 亚洲激情成人网| 国产不卡在线观看| 久久久久久av| 国外视频精品毛片| 日本韩国欧美精品大片卡二| 色无极影院亚洲| 国产精品第七十二页| 亚洲第一区中文字幕| 亚洲影院色在线观看免费| 亚洲天堂成人在线| 亚洲天堂av综合网| 中文字幕欧美日韩va免费视频| 国产精品白嫩美女在线观看| 国内外成人免费激情在线视频| 欧美激情一区二区久久久| 97视频在线观看视频免费视频| 亚洲精品98久久久久久中文字幕| 午夜欧美大片免费观看| 欧美亚洲另类制服自拍| 色综合五月天导航| 日韩中文av在线| 久久青草精品视频免费观看| 欧美做爰性生交视频| 日韩亚洲成人av在线| 日韩av最新在线| 欧美中文字幕视频在线观看| 2020久久国产精品| 亚洲欧美另类国产| 欧美视频精品一区| 久久久久国色av免费观看性色| 久久久久中文字幕| 成人免费网站在线观看| 欧美亚洲国产日本| 另类美女黄大片| 青青青国产精品一区二区| 成人免费直播live| 国产日韩在线精品av| 亚洲图片在线综合| 亚洲自拍偷拍色图| 国产成人亚洲综合91| 精品亚洲精品福利线在观看| 亚洲色图第三页| 国a精品视频大全| 久久久人成影片一区二区三区观看| 亚洲免费一级电影| 国产欧美精品一区二区| 国产精品高清在线观看| 国模吧一区二区三区| 欧美高清视频免费观看| 一区二区三区动漫| 91精品久久久久久久久久入口| 国产精品成av人在线视午夜片| 亚洲天堂av电影| 91高潮在线观看| 欧美日本亚洲视频| 九九热99久久久国产盗摄| 中文字幕免费精品一区高清| 成人精品视频久久久久| 亚洲网站在线观看| 国产高清视频一区三区| 91chinesevideo永久地址| 日韩成人中文电影| 精品久久久久久| 国产精品va在线播放| 国产精品中文久久久久久久| 久久资源免费视频| 日韩精品一区二区三区第95| 日韩av中文字幕在线免费观看| 色先锋资源久久综合5566| 68精品国产免费久久久久久婷婷| 久久久久这里只有精品| 日本久久91av| 欧美性理论片在线观看片免费| 久久人人爽亚洲精品天堂| 精品国产区一区二区三区在线观看| 久久精品亚洲国产| 美女精品久久久| www国产亚洲精品久久网站| 欧美肥婆姓交大片| 国产精品第100页| 午夜精品福利在线观看| 国产精品久久久久久久久久久久久| 久久不射电影网| 国内精品久久久久久中文字幕| 久久成人亚洲精品| 成人欧美在线视频| 热久久免费国产视频| 国产69精品99久久久久久宅男| 日韩激情第一页| 日本精品一区二区三区在线播放视频| 日韩精品视频免费专区在线播放| 久久香蕉精品香蕉| 日韩精品一区二区三区第95| 中文字幕欧美日韩在线| 中文字幕日韩在线播放| 亚洲精选在线观看| 91精品国产高清自在线| 中文一区二区视频| 亚洲少妇中文在线| 欧美视频在线免费看| 成人97在线观看视频| 久久亚洲精品小早川怜子66| 亚洲国产精品悠悠久久琪琪| 欧美寡妇偷汉性猛交| 欧美在线性视频| 日韩电影免费在线观看中文字幕| 亚洲成人精品视频在线观看| 日韩美女在线看| 成人免费淫片aa视频免费| 久久久午夜视频| 日韩视频亚洲视频| 国产午夜精品免费一区二区三区| 国产成人综合亚洲|