Tab补全
命令补全
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令。而在很多情况下,我们对某些命令可能会记得不牢固,从而敲错,这个时候就可以用上bash的命令补全机制了。
命令查找机制:
- 查找内部命令
- 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名
- 给定的起始字符串如果能惟一标识某命令程序文件,则直接补全。
- 不能惟一标识某命令程序文件,再击tab键一次,则会给出列表。
路径补全
在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件
tab:如果能惟一标识,则直接补全,否则,再一次tab,给出列表。
命令行展开
命令行展开也为bash的一大特性,即使用带~和{}
- ~:自动展开为用户的家目录,或指定的用户的家目录
- {}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径。
例如1:
mkdir -pv /tmp/test/{a,b{x,y}}
例如2:
mkdir -pv /tmp/test/{a,b,{x,y}}
命令的执行状态结果
Linux的命令执行,无非两种结果,即成功或者失败,而在bash里会用返回值0-255来标识命令的执行状态。
0:成功
1-255:失败
在命令执行完成之后,其状态返回值保存于bash的特殊变量$?中。
例如:
pwd
echo $?
pwa
echo $?
快捷键
- Ctrl+a:跳转至命令行行首
- Ctrl+e:跳转至命令行行尾
- Ctrl+u:删除行首至光标所在处之间的所有字符
- Ctrl+k:删除光标所在处至行尾的所有字符
- Ctrl+l:清屏,相当于clear
命令行历史
shell进程会在其会话中保存此前用户提交执行过的命令。而命令历史主要使用命令history来实现。
命令用法:
history
- -c: 清空命令历史
- -d :删除指定命令历史
- -r: 从文件读取命令历史至历史列表中
- -w:把历史列表中的命令追加至历史文件中
- history #:显示最近的#条命令
日常使用:
- !#:再一次执行历史列表中的第#条命
- !!:再一次执行上一条命令
- !STRING:再一次执行命令历史列表中最近一个以STRING开头的命令
- 调用上一条命令的最后一个参数
- 快捷键:ESC, .
- 字符串:!$
我们还可以通过修改环境变量来定制history命令的一些功能
- HISTSIZE:指定shell进程可保留的命令历史的条数
- HISTFILE:指定持久保存命令历史的文件.bash_history
- HISTFILESIZE:指定命令历史文件的大小
同时我们也可以改变命令历史记录的方式:通过修改环境变量HISTCONTROL的值即可实现
- ignoredups:忽略重复的命令(默认)
- ignorespace:忽略以空白字符开头的命令
- ignoreboth:以上两者同时生效
命令别名(alias)
命令别名即可以在bash中为我们经常使用的一些命令定义某个简短的命令,从而增加工作效率,比如我们要打开网卡文件,即可以将vim /etc/sysconfig/network...等一大串的命令即参数直接定义为vimnet即可。这样会方便管理惭怍,除此之外,linux自身也会自带一些命令别名。
alias
显示当前shell进程所有可用的命令别名;
alias NAME='VALUE'
定义别名NAME,其相当于执行命令VALUE
alias
alias vimnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'##相当于以后想要配置网卡eth0直接输入命令vimnet就可以了
注意:在命令行中定义的别名,仅对当前shell进程有效;如果想永久有效,要定义在配置文件中
- 仅对当前用户:~/.bashrc
- 对所有用户有效:/etc/bashrc
注意:编辑配置给出的新配置不会立即生效想要立即生效需要让bash进程重新读取配置文件:
source /path/to/config_file. /path/to/config_file
撤消别名:unalias
unalias [-a] name [name ...]
注意: 如果别名同原命令的名称,则如果要执行原命令,可使用"\COMMAND"
文件名通配(globbing)
globbing:文件名通配(整体文件名匹配,而非部分)
匹配模式:元字符
- *:匹配任意长度的任意字符
- ?:匹配任意单个字符
- []:匹配指定范围内的任意单个字符
- 有几种特殊格式:
[a-z], [A-Z], [0-9], [a-z0-9]
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:所有空白字符
[[:punct:]]:所有标点符号
- [^]:匹配指定范围外的任意单个字符
[^[:upper:]]
[^0-9]
[^[:alnum:]]
例如:
1:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录
ls -d /var/l?[[:lower:]]
2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录
ls -d /etc/[0-9]*[^0-9]
3:显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录
ls -d /etc/[^[:alpha:]][[:alpha:]]*
ls -d /etc/[^a-z][a-z]*
4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/etc目录
cp -r /etc/m*[^0-9] /tmp/etc/
5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下
cp -r usr/share/man/man[0-9] /tmp/man/
6:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下
cp -r /etc/[mnrp]*.conf /tmp/conf.d/