Linux 中 10 个有效的下令行补全例子

这个功能被称作命令行补全bash,命令补全功能

澳门京葡网站 1

10. 当第二个法则未有成形结果时,就应用第二个

比方定义的补全法规未有生成相配时,能够采取 -o 选项生成补全。

$ complete -F _count_files -o dirnames ./countfiles.sh

如上,为 ./countfiles.sh 定义了 _count_files 补全函数。 假若 the
_count_files(卡塔尔 函数未有成形任何匹配的话,就能接触目录补全。

$ ls 
countfiles.sh    dir1/      dir2/      dir3/

$./countfiles.sh [TAB][TAB]
dir1    dir2    dir3

9. 写个函数来生成补全

你能够引进一个函数来定义补全。使用 -F 选项将函数名传给 complete
命令,施行函数生成补全内容。举例,函数如下:

_parser_options()
{
  local curr_arg;

  curr_arg=${COMP_WORDS[COMP_CWORD]}

  COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) );
}

在上述函数中:

  1. COMPREPLY : 该数组调控连按下 TAB 后出示的结果
  2. COMP_WOEscortDS : 该数组富含命令行输入的单词
  3. COMP_CWORD : COMP_澳门京葡网站,WO景逸SUVDS
    数组的目录,使用它来区分命令行能够访谈的单词地点
  4. compgen : -W 基于 $current_arg 提供可能的补全及其参数

该函数放在 parser_option 文件中,并由此 source 命令引进:

$ source parser_option

将该函数和你的 parser.pl 脚本关联起来:

$ complete -F _parser_options ./parser.pl

$ ./parser.pl [TAB][TAB]
-i       --incoming       -o       --outgoing       -m       --missed

如上,parser.pl 的取舍是由函数 _parser_options() 生成的。

提示: 查看/etc/bash_completion 来打听愈来愈多的可编制程序补全函数。

您也能够裁撤/etc/bash.bashrc(来自 Ubuntu Linux 13.04
系统)中如下的讲解,那样,你就可以无需执行上边的吩咐了:

1. 翻看已部分命令行补全

在启用可编制程序的授命行补专职能后,就曾经有了有的定义好的一声令下补全功用。complete
命令用于定义命令行补全。

要翻看已部分命令行补全,如下使用 complete 命令:

complete -p | less

上边例子中的 -p 选项是可选的。

澳门京葡网站 1

在 Linux 系统中,当您输入多少个指令,再按三遍 TAB
键,就能够列出富有以你输入字符开头的可用命令。那并不出奇,可能你已经精通了。那几个职能被称作命令行补全bash
completion。默许情况下,bash
命令行能够自动补全文件或目录名称。但是,大家得以增进 bash
命令补全功能,通过 complete 命令让它到达新的可观。

万后生可畏您未曾发觉这一个代码,也平昔不找到/etc/bash_completion文件,那么您只必要经过行使apt-get命令来安装bash_completion
包即可。

其风华正茂课程表明了我们是何许使用可编制程序的一声令下行补专职能(programmable
completion)把活动补全成效使用于采用也许命令行参数。

6. 富含前缀和后缀的补全

补全作用可以为实在的补全内容定义前缀和后缀。在底下的例子中,为
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<"

2. 列出 bash 中标准补全功效

默许情状下,Bash 为 Linux 客户提供了下列标准补全功效。

  1. 变量补全
  2. 客户名补全
  3. 主机名补全
  4. 渠道补全
  5. 文件名补全

咱俩在前头的  bash
标准补全中商量过这么些。

举例说:在输入 write 命令之后,借使您按若干遍 TAB
开关,自动补全效用会提供可供实施 write 操作的客户列表。

$ telnet [TAB][TAB]
localhost  dev-db  fileserver

5. 概念二个后台职责名补全

补全作用也能够以职责名作为补全参数。选项 -j
能够定义任务名作为传递给命令的参数,如下:

$ jobs
[1]-  Stopped                 cat
[2]+  Stopped                 sed 'p'

$ complete -j ./list_job_attrib.sh

$ ./list_job_attrib.sh [TAB][TAB]
cat   sed

至于后台职务,你能够参谋 Linux
后台义务中的例子领会怎么保管后台职务。

# . /etc/bash_completion

在底下的例子中,可感觉 telnet 命令突显可用的主机名:

7. 带有息灭的公文名和目录名补全

若是脚本运维达成后,输出目录如下:

$ cd output/

$ ls
all_calls.txt   incoming_calls.txt   outgoing_calls.txt   missed_calls.txt
parser_mod.tmp  extract.o

如上,假如您想要 ls 命令的补全忽视 .tmp 和 .o 文件:

$ 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 是一个情形变量,它包涵了机动补全所要求免去的公文名后缀。

$ write [TAB][TAB]
bala      raj
jason     randy
john      ritu
mayla     thomas
nisha     www-data

要让可编制程序命令补全作用在你的顶峰起效果
,你只必要如下执行/etc/bash_completion即可:

3. 定义二个发令名补全

透过 -c
选项能够将装有的可用命令作为一个发令的补全参数。在上边的事例里面,为
which 命令定义了二个补全(LCTT译注:在按两下 TAB
时,可以列出全部命令名作为可补全的参数)。

$ complete -c which

$ which [TAB][TAB]
Display all 2116 possibilities? (y or n)

如上,假如按下 ‘y’,就能够列出装有的命令名。

### 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
  fi
fi

8. 透过 IFS 变量分割字符串获得补全值

能够经过 -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

4. 概念叁个目录补全

由此增选 -d,能够定义三个仅包罗目录名的补全参数。在上面包车型地铁例证中,为
ls 命令定义了补全。

$ ls
countfiles.sh  dir1/          dir2/          dir3/

$ complete -d ls

$ ls [TAB][TAB]
dir1/          dir2/          dir3/

如上,连按下 TAB 仅会显得目录名。