日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

shell 补齐路径_bash shell:命令的文件名自动补全设置

發(fā)布時(shí)間:2025/3/20 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell 补齐路径_bash shell:命令的文件名自动补全设置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家都知道 bash

里有個(gè)文件自動(dòng)補(bǔ)全功能,按兩下?Tab?鍵顯示出候選補(bǔ)全文件名,不同程序會(huì)顯示相應(yīng)的文件類型(根據(jù)擴(kuò)展名來(lái)判斷),例如

mplayer 會(huì)顯示媒體文件(如 avi、mpg、mkv),而不會(huì)顯示文本文件(如 txt、cfg、ini),而 Vim

則是反過(guò)來(lái),這樣的一直以來(lái)相當(dāng)好用,不過(guò)還是有些時(shí)候還是挺煩人的。

有時(shí)我想用 Vim 的 diff 功能來(lái)比較文件,比如兩個(gè) java 的

class 文件,雖然 class 文件是二進(jìn)制文件,但在 Vim 中可以轉(zhuǎn)換成十六進(jìn)制來(lái)顯示,方便比較。打了 Vim

命令后,按兩下?Tab?并補(bǔ)全候選不會(huì)有

class 文件,所以你得手動(dòng)輸入。

mplayer

的一個(gè)參數(shù)?-ass-styles,這個(gè)參數(shù)用于使用外部

ass 字幕的樣式,后面接一個(gè) ass 文件的路徑,用樣也不會(huì)顯示出來(lái),因?yàn)?bash 的自動(dòng)補(bǔ)全里并沒有為這個(gè)參數(shù)定義過(guò)。

這兩個(gè)例子只是最近用到,其實(shí)一直以來(lái)也遇過(guò)這種情況,很多時(shí)候我會(huì)把按兩次?Tab?來(lái)當(dāng)

ls

命令使用,看看目錄下有什么文件,但這樣會(huì)讓某些文件沒顯示出來(lái),讓你誤以為文件不存在,當(dāng)前目錄短文件名就直接輸入算了,好幾層的目錄和長(zhǎng)文件名就麻煩,對(duì)于這種情況,我的土方法是

把打了一半的命令行?Ctrl

+ c?掉,然后用 ls 看列一下,復(fù)制粘貼路徑出來(lái)

或者先直接補(bǔ)全路徑后,把光標(biāo)移回開頭輸入命令名

這樣太不夠效率了,尤其是在調(diào)試時(shí),命令參數(shù)記得比路徑還要熟的,干脆關(guān)掉這個(gè)文件擴(kuò)展名檢測(cè)功能好了。

我記得 bash 的補(bǔ)全腳本在

/etc/bash_completion,這個(gè)文件好長(zhǎng),稍微看了一下,發(fā)現(xiàn)有關(guān)聯(lián)的代碼,比如這段看來(lái)就是定義補(bǔ)全的擴(kuò)展名

complete -f -X '!*.fig' xfig

complete -f -X '!*.@(mid?(i)|MID?(I)|cmf|CMF)' playmidi

complete -f -X '!*.@(mid?(i)|MID?(I)|rmi|RMI|rcp|RCP|[gr]36|[GR]36|g18|G18|mod|MOD|xm|XM|it|IT|x3m|X3M|kar|KAR)' timidity

complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vi vim gvim rvim view rview rgvim rgview gview

complete -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' emacs

complete -f -X '!*.@(exe|EXE|com|COM|scr|SCR|exe.so)' wine

直接執(zhí)行?complete?會(huì)輸出當(dāng)前定義過(guò)補(bǔ)全的命令,看樣子也是在

/etc/bash_completion 里定義的

$ complete | grep " mplayer\| vim"

complete -o filenames -F _mplayer mplayer

complete -o filenames -F _filedir_xspec vim

man 了一下 complete 命令,沒有手冊(cè),屬于 builtin

命令,上網(wǎng)找,簡(jiǎn)介在?這里?,用法在

大概看了一下用法,就是?complete

補(bǔ)全行為選項(xiàng) 命令名

-F:執(zhí)行指定函數(shù)名,候選結(jié)果保存在?COMPREPLY?數(shù)組變量里,補(bǔ)全功能更強(qiáng)大,可以實(shí)現(xiàn)命令參數(shù)補(bǔ)全,函數(shù)名在

/etc/bash_completion 定義的。

-f:補(bǔ)全文件名,后可跟?-X?參數(shù)。

-X:過(guò)濾表達(dá)式,符合表達(dá)式的文件名會(huì)被排除,即不會(huì)在補(bǔ)全候選顯示出來(lái),如果以感嘆號(hào)開頭,則表示反轉(zhuǎn),即符合表達(dá)式的文件名才顯示。

-o:補(bǔ)全類型,filenames?表示補(bǔ)全的是一個(gè)文件,跟?-f?參數(shù)使用才有效;其它值如?dirnames?表示補(bǔ)全目錄。

-F?執(zhí)行的函數(shù)比?-f

-X?更早執(zhí)行,這樣說(shuō)起來(lái)有點(diǎn)混亂,我測(cè)試了一下,

當(dāng)你輸入好「命令名 」,按兩下Tab鍵,開始補(bǔ)全。

bash

執(zhí)行了?-F?指定的函數(shù),函數(shù)執(zhí)行完后輸出數(shù)組變量?COMPREPLY?的結(jié)果,這個(gè)變量值有可能為空。

繼續(xù)根據(jù)?-f

-X?里的表達(dá)式,符合表達(dá)式的文件名不則顯示,同時(shí)結(jié)果再根據(jù)?-o?指定補(bǔ)全類型來(lái)決定是否顯示。

就以 Vim 和 mplayer 舉例

對(duì)于 Vim 來(lái)說(shuō),它最終被定義的行為這樣

complete -o filenames -F _filedir_xspec -f -X '*.@(o|so|so.!(conf)|a|rpm|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MPG|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)' vim

先執(zhí)行?_filedir_xspec?函數(shù),而這個(gè)函數(shù)執(zhí)行后變量?COMPREPLY?為空,所以什么也沒輸出。接著補(bǔ)全文件名,可以看?class?字符串在表達(dá)式里面,所以不顯示。如果刪掉?class|?再運(yùn)行,就可以匹配

class 文件了。

對(duì)于mplayer,它最終被定義的行為這樣

complete -o filenames -F _mplayer mplayer

先執(zhí)行了?_mplayer?函數(shù),這個(gè)函數(shù)在

/etc/bash_completion 代碼非常多,mplayer 的選項(xiàng)參數(shù)都打上去了,所以能補(bǔ)全 mplayer

的選項(xiàng)參數(shù)。到補(bǔ)全文件名時(shí),沒有指定過(guò)濾表達(dá)式,所以什么都沒做。亦即它的補(bǔ)全功能全由?_mplayer?函數(shù)完成。

以上結(jié)果純屬連猜帶蒙,若有錯(cuò)誤,煩請(qǐng)指正,為了介紹一個(gè)小功能碼了這么多字容易嘛我,所以

臨時(shí)禁用 Vim 的補(bǔ)全功能就是

complete vim

保留路徑補(bǔ)全,但不要擴(kuò)展名檢測(cè),不指定「-X」即可

complete -f vim

只補(bǔ)全文件

complete -o filenames -f vim

只補(bǔ)全目錄

complete -o dirnames vim

總結(jié)

以上是生活随笔為你收集整理的shell 补齐路径_bash shell:命令的文件名自动补全设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。