(六)Linux命令⾏⾃动补全功能详解(实例演⽰)Linux命令⾏⾃动补全功能详解(实例演⽰)
⽂件名(或者⽬录名)是执⾏ Linux 命令中最常见的参数,例如前⾯介绍的 cd、mkdir、cp 等命令,都涉及到了⽂件名。然⽽对初学者来说,输⼊完整的⽂件名感觉很⿇烦,尤其⾯临⽂件名(⽬录名)特别长的时候。
考虑到这种情况,Shell(Bash)提供了⼀种称为“命令⾏⾃动补全”的功能,即在输⼊⽂件名的时候,只需要输⼊该⽂件名的前⼏个字符,然后按 Tab 键,Shell 就可以⾃动将⽂件名补全。
举个例⼦,在 /etc ⽬录下,执⾏如下命令:
[root@localhost ~]# cd /etc
[root@localhost etc]# cd fs <-- 按⼀次 Tab 键
当按下 Tab 键时,你会发现 Shell ⾃动将 "fs" 补全成了 "fatab",这是因为当前 /etc ⽬录中只有 fstab 是以 "fs" 开头,因此 Shell 可以确定这⾥想要输⼊的⽂件名称为 fstab。
那么,如果当前⽬录中含有多个以指定字符(或字符串)开头的⽬录或⽂件,Shell 还可以成功辨认吗?答案是否定的,但它会以列表的形式给出所有以指定字符或字符串开头的⽂件或⽬录,供⽤户选择。
例如,还是在 /etc ⽬录下,执⾏如下命令:
[root@localhost etc]# cd b <-- 连续按两次 Tab 键
bash_completion.d/      blkid/          bonobo-activation/
bashrc                  bluetooth
可以看到,当按⼀次 Tab 键时,Shell 没有任何反映,原因就是当前⽬录下以 "b" 为开头的⽂件或⽬录有多个(2 个以上),仅凭⼀个字符"b" ⽆法精准判断出具体指的是哪个⽂件。⽽当再⼀次按下 Tab 键时,Shell 会列表的形式显⽰给⽤户当前⽬录下所有以 "b" 开头的⽂件或⽬录。
事实上,Shell 提供的命令⾏补全功能不仅适⽤于补全⽂件名,也同样适⽤于所有 Linux 命令。举个例⼦,当输⼊ ca 并连续按下 2 次 Tab
键时,Shell 会罗列出所有以 "ca" 开头的 Linux 命令,如下所⽰:
[root@localhost etc]# ca <--连续按两次 Tab 键
cacertdir_rehash    cache_restore      capsh      catchsegvlinux所有命令都无法使用
cache_check        cal                captoinfo
cache_dump          caller              case
cache_repair        canberra-gtk-play  cat
另外,Shell 还有⼀套被称作通配符的转⽤符号(如表所⽰),这些通配符可以搜索并匹配⽂件名的⼀部分,从⽽⼤⼤简化了⽂件名的输⼊。
符号作⽤
*匹配任意数量的字符。
匹配任意⼀个字符。
[]匹配括号内的任意⼀个字符,甚⾄ [] 中还可以包含⽤ -(短横线)连接的字符或数字,表⽰⼀定范围内的字符或数字。
为了学习这些通配符的⽤法,⾸先需要建⽴⼀个空⽬录(如 test),并在该⽬录中创建⼀些⽂件(供测试⽤),执⾏命令如下:
[root@localhost etc]# makdir test
[root@localhost etc]# cd test
[root@localhost test]# touch apple banana grape grapefruit watermelon
[root@localhost test]# ls
apple banana grape grapefruit watermelon
在此基础上,继续执⾏如下命令:
[root@localhost test]# ls a* <--匹配所有以 a 字符开头的⽂件名
apple
[root@localhost test]# ls g*t <--匹配所有以 g 字符开头,以 t 字符结尾的⽂件名
grapefruit
[root@localhost test]# ls *e* <--匹配所有包含 e 字符的⽂件名
apple grape grapefruit watermelon
[root@localhost test]# ls *n* <--匹配所有包含 n 字符的⽂件名
banana watermelon
结合以上实例,因为 * 可以匹配任何数量的字符,因此可以⼀⼀实现实例中标注的功能。
接下来,列举⼀下使⽤ ? 匹配⽂件名的⽰例:
[root@localhost test]# ls e
apple grape
[root@localhost test]# ls ge*
grape grapefruit
因为 1 个 ? 只能匹配 1 个任意字符,因此该⽰例中第⼀个例⼦表⽰的是匹配任意包含 5 个字符但以 e 结尾的⽂件(apple 和 grape),第⼆例⼦表⽰匹配任何以 g 开头且第 5 个字符为 e 的⽂件(grape 和 grapefruit)。
最后,列举⼀些使⽤括号 [] 匹配⽂件名的⽰例:
[root@localhost test]# ls [abw]*
apple banana watermelon
[root@localhost test]# ls [agw]*[ne]
apple grape watermelon
此⽰例中,第⼀个例⼦表⽰匹配任何以 a、b 或 w 开头的⽂件;第⼆个例⼦中表⽰匹配任何以 a、g、w 开头,以 n 或 e 结尾的⽂件名。
不仅如此,[] 中还可以通过 -(短横线)表⽰⼀定范围内的任意字符(或数字),例如:
[root@localhost test]# ls [a-g]*
apple banana grape grapefruit
其中,[a-g]* 表⽰匹配以字母 a 到 g 之间任何⼀个字母开头的⽂件名。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。