Linux中10個有用的命令列補齊命令

2021-06-21 09:54:36 字數 4736 閱讀 3321

在linux系統中,輸入乙個命令,再按兩次tab鍵,就會列出所有以輸入字元開頭的可用命令。

這並不新鮮,很可能你已經知道了這個。這個功能被稱作命令補全。預設情況下,bash命令列可以自動補全檔案或目錄名稱。

不過,我們可以使bash命令列補全執行更多的操作,通過補全命令可以讓它成就下乙個輝煌。

這個教程說明了我們是怎樣使用可程式設計的命令列補全功能(programmable completion)把自動補全的功能應用於選項或者命令列引數。

例如:在輸入write 命令之後,如果你按兩次tab按鍵,自動補全功能會提供執行write操作的列表。

$ write [tab][tab]

bala raj

jason randy

john ritu

mayla thomas

nisha www-data

在下面的例子中,輸入telnet命令將會顯示可用了主機名:

$ telnet [tab][tab]

localhost dev-db fileserver

要讓可程式設計命令補全功能在你的終端起作用 ,你只需要執行/etc/bash_completion即可,就像下面展示出來的操作:

# . /etc/bash_completion
你也可以取消/etc/bash.bashrc(對於ubuntu linux 13.04系統)下面的注釋,這樣,你就可以不需要執行上面的命令了,

enable bash completion in interactive shells

if ! shopt -oq posix; then

if [ -f /usr/share/bash-completion/bash_completion ]; then

. /usr/share/bash-completion/bash_completion

elif [ -f /etc/bash_completion ]; then

. /etc/bash_completion

fifi

如果你沒有發現這些**,也沒有找到/etc/bash_completion檔案,那麼你只需要通過使用apt-get命令來安裝bash_completion 包即可。

啟用可程式設計的bash命令列補全功能,就可以定義一套bash補全命令。命令列補全可以用來定義bash補全命令。

來看一下現有的bash補全功能,使用完整的命令,如下:

complete -p | less
選項 -p 是可選擇的。

bash為linux使用者預設提供了下面的標準補全命令。

變數名補全(variablename completion)

使用者名稱補全(username completion)

主機名補全(hostname completion)

path路徑補全(pathname completion)

檔名補全(filename completion)

我們已經在更早的一篇文章bash standard completion 中討論了這些。

使用-c引數定義乙個補全命令來獲得可使用的命令列表。在下面的例子中,為which命令定義了補全命令,

$ complete -c which

$ which [tab][tab]

display all 2116 possibilities? (y or n)

就像上面看到的,如果按"y",所有的命令都會顯示出來。

使用引數d,定義乙個只獲得目錄名稱的補全命令,下面的例子中,定義了ls的補全命令

$ ls

countfiles.sh dir1/ dir2/ dir3/

$ complete -d ls

$ ls [tab][tab]

dir1/ dir2/ dir3/

就像上面看到的,連續按兩次tab,就可以看到目錄名稱。

通過使用complete命令,把獲得job名稱作為引數是允許的。引數j用來把job名稱作為引數傳到命令列,展示如下:

$ jobs

[1]- stopped cat

[2]+ stopped sed 'p'

$ complete -j ./list_job_attrib.sh

$ ./list_job_attrib.sh [tab][tab]

cat sed

補全命令可以通過被字首(在後面新增)和字尾(新增在後面)來定義。在下面的例子中,字首和字尾在list_job_attrib.sh中被定義。

$ jobs

[1]+ stopped cat

$ complete -p '">' -s '<"' ./list_job_attrib.sh

$ ./list_job_attrib.sh [tab][tab]

$ ./list_job_attrib.sh ">cat<"

看看下面的指令碼,輸出output 目錄下面的檔案:

$ cd output/

$ ls

all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt

parser_mod.tmp extract.o

在上面的例子中,如果你想要排除以.tmp和.o為字尾的檔案,實現ls命令的自動補全功能,可以這樣:

$ export fignore='.tmp:.o'

$ complete -f -d ls

$ cd output

$ ls [tab][tab]

all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt

fignore 是乙個shell變數,它包含了排除在自動補全佇列中的檔案的檔名的字尾。

單詞表可以通過使用w引數被ifs 變數中定義的字串分割成多個單詞。最終每個單詞都會被分開,被顯示出來。

$ export ifs=" "

$ complete -w "bubble quick" ./sort_numbers.sh

$ ./sort_numbers.sh [tab][tab]

bubble quick

如上所述,被ifs分割之後,單詞就會被擴充套件開,所以也可能有下面展示的這些變數。

$ echo $sort_type1

bubble

$ echo $sort_type2

quick

$ complete -w "$sort_type1 $sort_type2" ./sort_numbers.sh

$ ./sort_numbers.sh [tab][tab]

bubble quick

你可以宣告乙個函式來定義補全功能。使用 -f 引數,被傳入到補全命令的函式名,可以執行並。例如,函式可以寫成下面的樣式。

_parser_options()

compreply=( $(compgen -w '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) );

}

在上面的函式中,

compreply :儲存在按下[tab][tab]之後列印資訊的陣列。

comp_words :在命令列輸入的單詞陣列

comp_cword :comp_words 陣列的索引,可以訪問命令列中不用位置的單詞。

compgen :使用-w引數,持有current_arg變數中盡可能完整的、分開的內容。

檔案中parser_option 函式通過source執行如下:

$ source parser_option
這個函式鏈結到指令碼解析器如下:

$ complete -f _parser_options ./parser.pl

$ ./parser.pl [tab][tab]

-i --incoming -o --outgoing -m --missed

就像上面所看到的,解析器的引數可以通過_parser_options函式生成。

通過定義的補全規範,沒有進行匹配,那麼通過-o引數定義的completion 就會執行。

$ complete -f _count_files -o dirnames ./countfiles.sh
同上,通過使用_count_files 檔案中定義的_count_files 函式定義的completion ,如果_count_files函式沒有進行匹配,那麼就會執行目錄補全。

$ ls 

countfiles.sh dir1/ dir2/ dir3/

$./countfiles.sh [tab][tab]

dir1 dir2 dir3

10個有用的Linux命令

1.如何暫停乙個正在執行的程序,讓其在後台執行?答案 為了停止正在執行的程序,讓其在後台執行,我們可以使用組合鍵 ctrl z。2.什麼是安裝linux所需的最小分割槽數量,以及如何檢視系統啟動資訊?答案 單獨乙個 root分割槽足以執行所有的系統任務,但是強烈建議安裝linux時,需要至少三個分割...

Linux中的命令列

1.shell 是什麼?shell既是為使用者提供操作介面的軟體,也是核心保鏢。shell分為倆種,一種是圖形介面shell,另一種是命令列式shell 2.kernel 核心 是系統核心程式,負責管理系統的程序,記憶體,裝置驅動程式,檔案和網路系統。3.命令列提示符 kiosk 開啟shell的使...

Linux命令列基礎 常用的命令列

符號 符號含義 使用者目錄 也稱作家目錄 根路徑,即整個系統 所在當前目錄 當前目錄的上一級目錄 提示可以輸入命令列了 回車 carriage return 執行輸入的命令列 絕對路徑 開頭的路徑就是絕對路徑,不是這種開頭的就是相對路徑。命令列命令列的英文全寫 中文含義 pwdprint worki...