1、命令行编辑功能
命令行编辑功能是指用户可以使用方向键前后移动光标,并编辑已经输入的命令,这个命令非常实用、方便。
提示:可能大多数读者都没有使用过不带命令行编辑功能的shell,有兴趣的读者可以使用系统自带的bsh。bsh是一个不带命令行编辑功能的shell,输入命令时如果发现某处输入错误,不能修改,只能重新输入该命令,非常不方便。
(1)更改行编辑器的首选编辑模式
bash同时支持vi和emacs编辑器(vi和emacs是Linux系统中最常用的两种编辑器)中的一些行编辑快捷键,如果未进行设置,bash将使用emacs编辑器风格。如果需要修改首选编辑模式,可以使用命令set -o指定。
例如修改首选编辑模式为vi:
[root@localhost etc]# set -o vi
运行上面的命令之后,bash将使用vi的风格接受输入。这时可以使用vi编辑器的方式进行操作了,例如使用H和K前后移动光标等。
(2)快速移动光标
在命令行中输入命令时,可以使用左右方向键在字符间快速前后移动光标并修改已输入的命令。移动光标还可以使用以下快捷键:
ctrl+B:向前移动一个字符
ctrl+F:向后移动一个字符
ctrl+A:快速移动到行首
ctrl+E:快速移动到行尾
(3)行内删除
将光标移动到要修改的位置后,可以使用退格键(backspace)删除光标所在位置的前一个字符,使用删除键(delete)将删除当前光标处的字符。输出操作的其他快捷键如下:
ctrl+D:删除当前光标处的字符(相当于delete)
ctrl+H:删除当前光标的前一个字符(相当于backspace键)
ctrl+U:删除当前光标到行首的所有字符
ctrl+K:删除当前光标到行尾的所有字符
2、绑定快捷键和命令
命令行模式中默认定义了许多快捷键,这些快捷键由一个名为Readline的库实现。用户可以通过命令bind添加新快捷键,或者修改系统中已经存在的快捷键。
(1)查看系统中已绑定的快捷键
可以通过bind命令的选项P查看已经设定好的快捷键:
[root@localhost ~]# bind -P abort can be found on "\C-g", "\C-x\C-g", "\M-\C-g". accept-line can be found on "\C-j", "\C-m". alias-expand-line is not bound to any keys arrow-key-prefix is not bound to any keys backward-byte is not bound to any keys backward-char can be found on "\C-b", "\M-OD", "\M-[D". backward-delete-char can be found on "\C-h", "\C-?". backward-kill-line can be found on "\C-x\C-?". backward-kill-word can be found on "\M-\C-h", "\M-\C-?". backward-word can be found on "\M-[1;5D", "\M-[5D", "\M-b". beginning-of-history can be found on "\M-<", "\M-[5~". beginning-of-line can be found on "\C-a", "\M-OH", "\M-[1~", "\M-[H". call-last-kbd-macro can be found on "\C-xe". capitalize-word can be found on "\M-c". character-search can be found on "\C-]". character-search-backward can be found on "\M-\C-]" ......
在上面的命令输出中,“\C”表示ctrl键,例如“\C-b”表示ctrl+B组合键。“\M”表示meta键,另一些以“\e”开头的是一些功能键或编辑键,例如“\e[2~”表示insert键等。
提示:在Sun和其他公司生产的某些型号的键盘上存在meta键,键帽上有菱形标志,一般的键盘上可以使用alt或esc键替代。
(2)绑定快捷键命令bind的基本格式
bind命令用于定制系统快捷键,其基本格式如下:
bind [option] [[function name] [keyseq:shell-command] [file name] [keyseq:readline-function or readline-command]]
bind命令的常见选项如下:
keyseq:readline-function 是一个基本用法,参数keyseq表示指定的快捷键,readline-function参数表示要绑定的函数名称
m keymap 使用参数keymap指定的键盘映射
l 列出所有可用的readline函数名称
P 列出所有快捷键列表
p 列出当前readline库中的函数名称及绑定
f filename 从文件filename中读取绑定
r keyseq 取消由keyseq快捷键指定的所有绑定
x keyseq:shell-command 为keyseq指定的快捷键绑定由shell-command指定的shell命令
(3)修改或自定义快捷操作
在修改或定义快捷键之前,需要先查看readline库中可以使用的函数名称,查看函数名称可以配合使用 l 选项
[root@localhost ~]# bind -l abort accept-line alias-expand-line arrow-key-prefix backward-byte backward-char backward-delete-char ...... vi-yank-to yank yank-last-arg yank-nth-arg yank-pop
这些函数都是系统默认提供的,用户可以为这些函数绑定快捷键。
例如将删除光标前一个字符的函数(退格键backspace)绑定到快捷键ctrl+X上:
[root@localhost ~]# bind "\C-x":backward-delete-char
在上面的命令中,“\C-x”表示要绑定的快捷键组合,backward-delete-char则是readline库中的函数。读者可以直接套用这个格式,为readline库中的函数绑定快捷键。
(4)绑定应用程序和命令
bind命令不仅可以绑定一个已有函数,还可以配合使用选项x绑定一个程序。绑定程序的目的通常是为了能在需要时快速执行程序。
例如为了方便输入文本,使用快捷键ctrl+alt+v快速打开vi编辑器:
[root@localhost ~]# bind -x '"\C-\M-v":vi'
例如连续按两次快捷键ctrl+x就在当前目录中使用shell命令ls –l :
[root@localhost ~]# bind -x '"\C-x\C-x":ls –l'
上面两条使用选项x的命令中,都使用了将快捷键及要执行的命令或程序放入单引号中的方法,其目的是避免bind误解。
(5)保存修改的快捷键
修改或添加快捷键后,如果系统重新启动或用户重新登录,这些设置将会丢失,如果需要继续生效,就要将这些设置保存到配置文件中。
- 在系统中有两个文件用于保存设置的快捷键,其一是/etc/inputrc,该文件中保存的快捷键对登录系统的每个用户都会生效;另一个文件是~/.inputrc,这个文件中保存的快捷键只会对家目录对应的用户生效。
要保存已设置的快捷键,可以使用选项p输出所有绑定,然后使用重定向的方法保存到家目录中:
[root@localhost ~]# bind -p > ~/.inputrc
完成上述操作后,用户只需要重启系统或重新登录,之前定义的快捷键就会生效。
注意:由于文件/etc/inputrc中保存的快捷键对每个用户都生效,因此通常不推荐将快捷键保存在此文件中。
- 然而有的系统不支持上述办法,这时可以尝试执行以下命令:
[root@localhost ~]# echo 'export $INPUTRC=~/.inputrc' >> ~/.bash-profile
上面这条命令的作用是将export $INPUTRC=~/.inputrc追加到文件~/.bash_profile的结尾(环境变量INPUTRC的作用是保存快捷键文件的路径)。
执行以上命令后,系统读取快捷键设置时,将不再读取文件/etc/inputrc中的内容,而是读取用户家目录中的文件~/.inputrc.
- 然而不幸的是有的系统对以上两种方法都不支持,这时可以在文件~/.bash_profile最后加入以下内容:
if [ -f ~/.inputrc ]; then bind -f ~/.inputrc fi
添加了上述内容之后,用户登录时将会主动读取已保存的快捷键设置。
上面的3种方法只能保存为readline库中的函数设置的快捷键,自定义的程序和shell命令将不会被保存,使用以下方法可以保存这些自定义程序和shell命令
首先在用户主目录下新建一个名为~/.custom_bind的文件,将要绑定的信息写入其中。
这个例子将使用上面的两条命令:
bind -x '"\C-\M-v":vi' bind -x '"\C-\M-v":ls -l'
然后编辑用户主目录下的文件.bash_profile,向文件结尾追加以下内容:
if [ -f ~/.custom_bind ]; then . ~/.custom_bind &>/dev/null fi
像上面的内容一样,if语句先判断是否存在文件~/.custom_bind,如果存在,就执行后面的命令。“. ~/.custom_bind &>/dev/null”(点号后面有一个空格)这条命令前面的“.”告诉bash应该像命令那样执行文件~/.custom_bind的内容。最后的&>/dev/null 表示如果在执行过程中有需要输出的信息(例如命令的正常输出、输出的错误提示等),就将要输出的信息写入到文件/dev/null(/dev/null是一个字符设备文件,所有输出到这个文件的内容将会被丢弃,所以人们将它形象的称为“系统垃圾池”或“系统池”)中。
提示:如果要改变所有用户的快捷键设置,仍然不建议将绑定写入文件/etc/inputrc中。此时可以将相关的文件放入目录/etc/skel中,并修改该目录中的相关文件(该目录中的内容同家目录中的内容完全一致)。当新用户被创建时,系统会自动将目录/etc/skel/中的内容拷贝到新用户的家目录中,这样新添加的用户就获得了自定义的快捷键设置。
3.命令行补全功能
连续两次按Tab键:
(1)自动补全命令
(2)自动补全文件名
4.命令历史功能
(1)使用命令历史功能
快速调出曾经执行过的命令:上、下方向键(或者Ctrl+P和Ctrl+N)
查看更多历史命令:history
[root@localhost ~]# history | more 1 uname -r 2 ls 3 shutdown -h now 4 ping 192.168.1.1 5 ifconfig 6 ifconfig 7 rpm -qi telnet 8 telnet 9 shutdown -h now 10 ls......
默认情况下history命令最多可以输出1000个。查询到历史命令之后,可以使用符合“!”引用这些历史命令。例如:
[root@localhost ~]# !2 ls anaconda-ks.cfg Desktop install.log install.log.syslog
(2)在命令历史中搜索
当历史命令众多时,查找起来可能会相当麻烦,这时可以使用历史命令搜索功能.历史命令搜索功能的快捷键是Ctrl+R,直接使用该快捷键,命令提示符会变为:
(reverse-i-search)`':
在提示符":"(冒号)后面输入要查找命令的内容,Bash将会动态地将与输入相匹配的内容放在提示符后面.如果找到相关的命令,就可以停止输入,并按Enter键执行找到的历史命令,按Enter后提示符变回“#”,并直接执行找到的命令。
(3)系统如何记录命令历史
每个用户的家目录有一个名为.bash_history的文件,该用户的历史命令都被记录到这个文件中。可以通过直接查看该文件的内容的方式查看使用过的历史命令。查看该文件内容,我们发现找不到当前输入的命令,这是因为用户输入命令时,bash只会将命令记录到系统缓存中,当bash退出时(这个过程发生在用户登出系统或系统关闭时),才会将缓存中的历史命令写入.bash_history文件中。
(4)控制命令历史功能
有时可能需要控制用户的历史命令功能,这时就需要注意到系统中的3个环境变量:
#使用set命令输出所有的环境变量并从中筛选出含有HIST的行 [root@localhost ~]# set | grep HIST HISTFILE=/root/.bash_history HISTFILESIZE=1000 HISTSIZE=1000
上面的变量中定义了保存历史命令的文件和历史命令的条数等内容,用户也可以通过修改这3个变量的值,改变bash记录历史命令的位置和条数
(5)清空命令历史
如果要清空历史命令,可以使用history命令的-c选项
[root@localhost ~]# history -c [root@localhost ~]# history 1 history
注意:如果系统供多个用户使用,root用户保存的历史命令可能会引发一些安全性问题。这时可以使用修改环境变量的方法,让bash不记录历史命令。
5、命令别名功能
(1)系统定义的别名
通常情况下,系统中已经定义了一些命令别名,要查看已经定义的命令别名,可以使用alias命令:
#alias命令将输出所有已经定义的命令别名 [root@localhost ~]# alias alias cp='cp -i' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
用于设置系统别名的相关文件保存在/etc/profile.d/目录中(系统别名目录)。
(2)用户自定义别名(命令格式同系统定义别名)
[root@localhost ~]# alias type='cat'
(3)取消定义的别名
[root@localhost ~]# unalias type
(4)保存别名设置
当系统重新启动或用户重新登录时,使用alias命令定义的别名将会丢失。可以在系统别名目录中添加别名设置文件,但这种方式定义的别名对所有的用户都生效,通常不建议使用这种方法。
如果要定义全局别名,通常建议将命令添加到全局配置文件/etc/profile中。例如定义全局别名:
[root@localhost ~]# echo "alias type='cat'">>/etc/profile
这条命令将alias type='cat'添加到文件/etc/profile中。
注意:在对/etc/profile这样的系统配置文件进行操作时,一定要谨慎,否则有可能会损坏系统。因此上面的命令中使用的是“>>”而不是“>”,“>>”表示将内容追加到文件结尾。
如果某个用户想要定义自己的命令别名,可以将命令添加到用户家目录中的文件.bash_profile中。例如要定义用户自己的别名:
[zhu@localhost ~]$ echo "alias vi='vim'">>~/.bash_profile