补全
命令补全
一次 TAB:如果用户给定的字符串只有一条唯一对应的命令,一次 TAB 则直接补全。
两次 TAB:如果用户给定的字符串开头对应的命令不唯一,再次 TAB 则会显示所有以该字符串开头的命令。
路径补全
把用户给定的字符串当做路径开头,并在其指定目录下搜索以指定字符串开头的文件名。如果唯一,则直接补全,否则再次 TAB 显示列表。
命令行展开
展开为当前用户主目录
[root@zze testdir]# cd ~
[root@zze ~]#
展开指定用户的家目录
[root@zze testdir]# cd ~root/
[root@zze ~]#
路径展开
{}
可承载一个逗号分隔的列表,并将其展开为多个路径。
/tmp/{a,b} -> /tmp/a , /tmp/b
/tmp/{a,b}/c -> /tmp/a/c , /tmp/b/c
练习
如何一次性创建 'tmp/x/y1' , 'tmp/x/y2' , 'tmp/x/y1/a' , 'tmp/x/y1/b' , 'tmp/x/y2/a' , 'tmp/x/y2/b' ?
[root@zze testdir]# mkdir -p tmp/x/{y1,y2}/{a,b}
[root@zze testdir]# tree tmp/
tmp/
└── x
├── y1
│ ├── a
│ └── b
└── y2
├── a
└── b
directories, 0 files
如何一次性创建 'x_m' , 'y_m' , 'x_n' , 'y_n' ?
[root@zze testdir]# mkdir -p {x,y}_{m,n}
[root@zze testdir]# ls
x_m x_n y_m y_n
如何一次性创建 'tmp/bin' , 'tmp/sbin' , 'tmp/usr/bin' , 'tmp/usr/sbin' ?
[root@zze testdir]# mkdir -p tmp/{bin,sbin,usr/{bin,sbin}}
[root@zze testdir]# tree tmp
tmp
├── bin
├── sbin
└── usr
├── bin
└── sbin
directories, 0 files
命令的执行状态结果
bash 使用特殊变量 $?
保存最近一条命令的执行状态结果:
[root@zze ~]# ls /~
ls: cannot access /~: No such file or directory
[root@zze ~]# echo $?
2
0:成功,1-255:失败
程序执行有两类结果,执行的返回值结果和执行的状态结果。
命令别名
命令别名主要通过 alias
实现,看如下示例:
alias cdnet='cd /etc/sysconfig/network-scripts'
上述命令就是新建了一个名为 cdnet
的别名,新建完成之后执行 cdnet
命令就相当于执行 cd /etc/sysconfig/network-scripts
。
当 alias
命令不指定参数时默认显示当前会话中所有已经存在的别名信息,如下:
root@zze-pc:~# alias
alias cdnet='cd /etc/sysconfig/network-scripts'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias mv='mv -i'
注意:上述别名的定义默认只对当前 shell 会话进程有效。
如果想要永久生效,则需要定义在配置文件中。在~/.bashrc
中配置仅对当前用户有效;在/etc/bashrc
中配置则对所有用户有效。如果想要撤销别名,则可通过unalias
命令,如:
unalias cdnet
上述命令就是撤销当前会话中名为 cdnet
的别名。同理,如果是定义在配置文件中的别名,需要在配置文件中删除对应的定义。还可以制定选项直接删除当前会话中所有别名信息,如下:
unalias -a
看如下情形,如果当前会话中定义了一个如下别名:
alias cp='cp -i'
即别名名称和命令原名称有冲突,如果我们需要单纯的执行 cp
指令,则只需要在指令前加上 \
就会执行命令本身而不会执行别名对应的命令,所以使用 \cp
就可以满足我们的要求。
glob文件名通配
glob 在 bash 中用于实现文件名“通配”,它的使用则需要借助到几个通配符,看如下示例:
先新建如下几个文件:
touch abc abbc abbd bbbc a1b
使用 * 号匹配任意长度的字符
列出所有以 a
开头的文件名:
root@zze-pc:~/temp# ls a*
a1b abbc abbd abc
使用 ? 匹配任意单个字符
列出以 a
开头且长度为 3 个字符的文件名:
root@zze-pc:~/temp# ls a??
a1b abc
使用 [] 匹配指定范围内的单个字符
列出以 a
开头且第二个字符为一个数字的文件名:
root@zze-pc:~/temp# ls a[0-9]*
a1b
使用 [^] 范围取反
列出第二个字符不是数字的文件名:
root@zze-pc:~/temp# ls ?[^0-9]*
abbc abbd abc bbbc
除了上述方式 glob 还提供了专用字符集合的方式来匹配,如下:
[:digit:]:任意数字,相当于 0-9
[:lower:]:任意小写字母
[:upper:]:任意大写字母
[:alpha:]:任意大小写字母
[:alnum:]:任意数字或字母
[:space:]:空格字符
[:punct:]:所有标点符号
[:graph:]:图片、图形
[:print:]:可打印字符
[:xdigit:]:十六进制字符
[:cntrl:]:控制符
评论区