Linux命令行自动补全功能详解(实例演示)
考虑到这种情况,Shell(Bash)提供了一种称为“命令行自动补全”的功能,即在输入文件名的时候,只需要输入该文件名的前几个字符,然后按 Tab 键,Shell 就可以自动将文件名补全。
举个例子,在 /etc 目录下,执行如下命令:
[root@localhost ~]# cd /etc
[root@localhost etc]# cd fs <-- 按一次 Tab 键
那么,如果当前目录中含有多个以指定字符(或字符串)开头的目录或文件,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 catchsegv cache_check cal captoinfo cache_dump caller case cache_repair canberra-gtk-play cat另外,Shell 还有一套被称作通配符的转用符号(如表 1 所示),这些通配符可以搜索并匹配文件名的一部分,从而大大简化了文件名的输入。
符号 | 作用 |
---|---|
* | 匹配任意数量的字符。 |
? | 匹配任意一个字符。 |
[] | 匹配括号内的任意一个字符,甚至 [] 中还可以包含用 -(短横线)连接的字符或数字,表示一定范围内的字符或数字。 |
为了学习这些通配符的用法,首先需要建立一个空目录(如 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 g???e*
grape grapefruit
最后,列举一些使用括号 [] 匹配文件名的示例:
[root@localhost test]# ls [abw]*
apple banana watermelon
[root@localhost test]# ls [agw]*[ne]
apple grape watermelon
不仅如此,[] 中还可以通过 -(短横线)表示一定范围内的任意字符(或数字),例如:
[root@localhost test]# ls [a-g]*
apple banana grape grapefruit