Bash readline 使用技巧

发布时间:2006-03-10 00:15:44来源:红联作者:Linux培训部长

很多人会用 Bash,但是很少有人知道 readline 是怎么回事。readline 是一个强大的库,只要使用了它的程序,都可以用同一个配置文件配置,而且用同样的方法操作命令行,让你可以方便的编辑命令行。

使用 readline 的程序现在主要有 Bash, GDB,ftp 等。readline 付予这些程序强大的 Emacs 似的命令行编辑方式,你可以随意绑定你的键盘。

术语解释

在下文中,我们经常提到 'C-x r' 这类键操作。'C-x r' 其实就是按Ctrl-x,然后按 r。同理 'C-M-@' 就是按 ctrl-alt-@(M表示meta, 在 PC 上就是 Alt 键),但是其实 @ 是shift-2 (看看你的键盘)。所以 'C-M-@' 实际上要你按 ctrl-alt-shift-2。

但是在配置文件里的键序列中,我们把 'C-x r' 表示为 '\C-xr', 把 'C-M-@' 表示为 '\C-\M-@',你自己看看就知道怎么回事了。同理 'Esc a' 别表示成 '\ea'。

这就是 Emacs 里的按键的通常标记方法。EMACS = Esc Meta Alt Ctrl Shift :)

技巧篇

在自己配置命令行之前,我们先来看看利用缺省的键绑定能够进行的一些巧妙的用法:

第一招:使用以前的命令行参数

你是否经常出现这种情况?你想把 ~/text-browser/ 目录下的3个.tar.gz文件搬到/usr3/software/,于是你输入:

$mv ~/text-browser/*.tar.gz /usr3/software/

我想你一定已经知道,打入 ~/text 之后按 TAB 就可以补全text-browser这个长文件名吧?这是Bash 的基本功能。我废话?好了,就当你知道吧。不过今天我要讲的东西比这个复杂一些。

Go on! 刚刚输入到这里,你突然想起,应该在 /usr3/software/ 下先建立一个目录叫browsers,这样放进去的文件比较好管理。

于是你 Ctrl-u,删掉了这行命令。唉呀,这么长的命令一下就没了。是不是有点可惜?这还不算麻烦。然后你

mkdir /usr3/software/browser

mv ~/text-browser/*.tar.gz /usr3/software/browser

嗯。TAB 是帮了你不少忙。可是你实际上有更好的办法来完成这项工作。好吧,看看 readline 怎样神奇的完成你的任务:

我们回到这种情况:

$mv ~/text-browser/*.tar.gz /usr3/software/

你刚才是按了 Ctrl-u 删除了所有输入的东西。可惜啊!你要是按 M-#(也就是按住 PC 机的 Alt 键,再按 #,实际上就是 Alt-Shift-3),那么 Bash 就会在这样最开头插入一个 '#',然后输入这行。这样命令就被作为一行注释载入了历史。

这有什么好处?这样你的这行命令里的内容就可以被再次利用。看着:你接着输入:

mkdir ...

等等,你是不是想输入 /usr3/software/?你不用再敲一遍了!直接按 M-.(Alt 加句号),看看, /usr3/software/ 是不是出现在命令行上了?M-. 就是调用了 yank-last-arg 函数,把上一条命令的最后一个参数放在命令行上。好了,回车吧!

你接着输入:

mv ...

等等,这下是该输入 ~/text-browser/*.tar.gz 了。烦不烦啊?换一种方式吧。请按:'M-1 M-.'(把上一条命令的第一个参数放在命令行上)。这样命令行成为了:

mv /usr3/software/browser

怎么成这样了?看看你的“上一条命令”是什么吧?是……你自己看。所以这个参数不是你想要的。那么继续再按一次 'M-.'。看到了吧?你的命令行已经成为:

mv ~/text-browser/*.tar.gz

好。打一个空格。再按一下 'M-.'。命令行变成了:

mv ~/text-browser/*.tar.gz /usr3/software/browser

这就是你想要的!

是不是看起来你还是花了不少工夫?但是想一想,如果你是要执行这样一个命令呢?

mv /data/ftp/pub/TUG/texmf/tex/latex/CJK/GB/GB.cap \

/usr/local/texlive/texmf-local/tex/latex/CJK/GB/

嗯。记住这个有用命令:M-. , 它的前面可以用 M-0, ... 作为数字参数。

第二招:补全命令名,文件名和变量名

你知道 TAB 可以补全命令行上很多东西。可是你遇到这种情况的时候怎么办?

man a-very-very-long-command-name

你输入了 man a-ver... 之后,按 TAB,什么反应也没有。因为 TAB 执行的是 “按情况补全”(complete),它看到 man,知道这应该是一个命令,那么它认为: “后面应该是一个文件名参数。” 但是你想要的是命令的名字怎么办?答案:按 'M-!'.

再来看:你需要设置 XMODIFIERS='@im=fcitx'。你输入了

export XM...

按 TAB? 没有反应。为什么呢?因为 TAB 的补全想要一个文件名,而当前目录没有开头是 'XM...' 的文件。那么你怎么补全?答案:'M-$'。

其实 readline 的补全方式被 Bash 扩充了很多。看看有多少吧!

'TAB': complete

'\M-!': complete-command

'\M-/': complete-filename

'\M-@': complete-hostname

'\M-~': complete-username

'\M-$': complete-variable

自己试试吧!

第三招:扩展命令行

你的一个目录里有很多类似的文件,名字叫 T12.txt, T12.log, T23.txt, T23.log, T13.txt, T13.log…… 有后缀 txt 的,也有后缀 log 的。... 你想把其中的某些 T*.txt 都移动到另外一个目录,而T*.log都不动。但是T*.txt 也不是全部都要移动。所以你想把T*.txt 都放在命令行上,然后选择其中一些。你输入:

mv T...

接着按 'M-*'(insert-completions)。结果 T 开头的文件都被放到命令行上了。嗯。这在某些时候是有用的,可是现在它把 T*.log 的文件也放上去了。不行。我们于是继续输入:

mv T*.txt

好了,现在我们可以使用 'C-x*'(先按ctrl-x,然后按*)。结果所有名字T*.txt 的文件都被放到了命令行上面。'C-x*' 执行的函数叫做 glob-expand-word.

配置篇

你是不是觉得那些命令很难记住?不顺手?别怕!它们都是可以改变的,就像Emacs的键绑定那样,可以被任意的改变!

所有使用readline的程序,都使用一个配置文件来决定它的行为和键绑定。这个文件一般是 INPUTRC 环境变量确定的。如果这个环境变量没有值,那么缺省使用 ~/.inputrc。

~/.inputrc 文件很简单,只有4种语句:

注释

变量设置语句(set variable value)

键绑定('keyseq':function)

条件语句($if ... $endif)

我们先不说其它的,先来看看键绑定吧!

键绑定

绑定语句。

你现在就可以动手设置你喜欢的控制方式。比如,我发现有些时候我需要在命令行上做上 mark(Emacs 术语),然后把mark 和光标之间的 region(Emacs术语) 删掉,这个操作在 Emacs 里叫做kill-region. 但是我们发现这个函数在 Bash 里缺省是没有绑定的。如果我希望得到跟 Emacs 一样的绑定 C-w 的话,就把这行插入到 ~/.inputrc:

'\C-w':kill-region

使绑定生效。为了使这个键绑定生效,你需要执行 re-read-init-file 函数。这个函数缺省绑定在了 'C-x C-r'。你修改 ~/.inputrc 之后在 Bash 里输入 'C-x C-r' 就可以使新的配置生效了。

列出可用的函数。

不过你怎么知道那些函数可以被绑定呢?readline 的 info 页列出了很多函数,可是你不会每次都去info里查询吧,很麻烦啊。其实你可以使用bash的 bind 命令来得到所有的键绑定:

$bind -p

可以显示所有现有的已经绑定和没有绑定的函数。没有被绑定的函数被显示为 '(not bound)',并被加上了注释。就像这样:

'\C-g': abort

'\C-x\C-g': abort

'\M-\C-g': abort

'\C-j': accept-line

'\C-m': accept-line

# alias-expand-line (not bound)

# arrow-key-prefix (not bound)

# backward-byte (not bound)

'\C-b': backward-char

'\M-OD': backward-char

'\C-h': backward-delete-char

'\C-?': backward-delete-char

你可以把这个命令的输出作为一个模板,嵌入到 ~/.inputrc 文件。把你喜欢的函数绑定到方便的按键。

其实 readline 有三个函数可以让你方便的查询函数,变量和宏的绑定情况,它们是:

dump-functions

dump-variables

dump-macros

可是它们缺省都没有被绑定到任何按键。你可以为它们分别设置类似 'C-xf', 'C-xv', 'C-xm' 这样容易记忆的绑定。

如果忘了绑定……

这样你就可以设置你需要的绑定啦!但是你还是有可能在需要的时候突然记不起哪些键绑定可以补全。这时候你输入:

$bind -p | grep compl

得到结果:

'\C-i': complete

'\M-\e': complete

'TAB': complete

'\M-!': complete-command

'\M-/': complete-filename

'\M-@': complete-hostname

'\M-{': complete-into-braces

'\M-~': complete-username

'\M-$': complete-variable

'\M-\C-i': dynamic-complete-history

'\M-g': glob-complete-word

'\M-*': insert-completions

.......

这样你记不住一个键的时候就可以方便的查询,这样几次之后,你就会把自己需要的按键都记住了。

配置变量

体验:

Bash 的 readline 有一些变量可以控制它的行为。比如:

bell-style 可以控制出错时是 audible(发出响声),visible(闪动屏幕),还是none(什么都不做);editing-mode 可以控制你是用 Emacs 的输入方式还是用 vi 的;

completion-query-times 的值控制在补全的个数超过多少N时,bash 提示: “Display all N possibilities? (y or n)”;

如果我设置 expand-tilde 为 on,当输入“ls ~/doc”,按 TAB 时,命令行会自动变成 'ls /home/wy/doc'.

如果把 visible-stats 设置为 on,那么列出补全的时候,目录,可执行文件,符号连接,会被分别使用 /, *, @ 来标记,就像 ls -F 的到的结果。

设置:

设置的方法极其简单,就在 ~/.inputrc 文件里写入类似语句:

set visible-stats on

然后 'C-x C-r' 使设置生效。

怎样知道有哪些设置?

可以设置的参数是很多的。使用命令

$bind -v

就可以得到所有这些可以设置的变量和它们的值了。

文章评论

共有 5 条评论

shuzhan87 于 2009-12-26 16:27:10发表:

原来如此

SageRoi 于 2009-12-15 22:32:01发表:

怎么我的用不了?

alick 于 2009-07-28 13:19:58发表:

EMACS = Esc Meta Alt Ctrl Shift :)

原来是这样啊

moonreplace 于 2009-07-28 13:15:15发表:

受教了

seoshagua 于 2009-07-27 22:51:15发表:

原来这个终端叫 bash 。。。找到了!!!!!!!!谢谢!

linux bash readline,Bash readline 使用技巧相关推荐

  1. linux 自定义shell命令,如何在Linux中自定义bash命令提示符

    前言 众所周知, bash (the B ourne- A gain Sh ell)是目前绝大多数 Linux 发行版使用的默认 shell.本文将会介绍如何通过添加颜色和样式来自定义 bash 命令 ...

  2. Linux系统管理员的Bash指南,11条Bash实践经验!

    每个职业都有最常用的工具.对于许多系统管理员来说,shell可能是比较熟悉的.在大多数Linux和其他类Unix系统上,默认的shell是Bash. Bash是一个相当古老的程序,它起源于20世纪80 ...

  3. centos中bash占用cpu,linux - 如何使用bash命令创建CPU峰值

    linux - 如何使用bash命令创建CPU峰值 我想在Linux机器上创建接近100%的负载. 它是四核系统,我希望所有内核全速运行. 理想情况下,CPU负载将持续指定的时间,然后停止. 我希望在 ...

  4. 解决linux mysql命令 bash: mysql: command not found 的方法

    解决linux mysql命令 bash: mysql: command not found 的方法 参考文章: (1)解决linux mysql命令 bash: mysql: command not ...

  5. linux中的bash shell的特性

    linux中的bash shell特性(基础) Shell也称命令行解释器,是我们对linux进行操作最直接的接触的脚本,所以说这对我们的今后的学习过程中非常重要. 当然,linux这种功能强大的操作 ...

  6. linux脚本算术函数,Linux基础之bash脚本编程初级-变量与算术运算

    什么是变量? 变量最初来源于数学,指的是非固定的值可变化的数通常用拉丁字母表示.在计算机中变量它依旧指的是可变化的数,只不过表现形式有些变化.它指的是变量名+所指向的内存空间. 以下实验环境均在Cen ...

  7. Linux基础之bash脚本编程初级-变量与算术运算

    什么是变量? 变量最初来源于数学,指的是非固定的值可变化的数通常用拉丁字母表示.在计算机中变量它依旧指的是可变化的数,只不过表现形式有些变化.它指的是变量名+所指向的内存空间. 以下实验环境均在Cen ...

  8. Linux错误:bash:finger 未找到命令...

    Linux错误:bash: finger: 未找到命令- #意外用了一下finger命令,结果显示未找到命令 [root@localhost ~]# finger -l root bash: fing ...

  9. linux文件名带星号,Linux安装之bash星号用法

    关于Linux安装之bash星号用法,星号,这是个神奇的符号,在bash中,星号也充满魔力,它是通配符之一. 简单列举下星号的功能,被称为万能字符不是没有理由的. 1)文件名匹配: 默认情况下匹配所有 ...

  10. linux内核与bash脚本接囗,Bash脚本编程之脚本基础和bash配置文件

    脚本基础 不严谨地说,编程语言根据代码运行的方式,可以分为两种方式: 编译运行:需要先将人类可识别的代码文件编译成机器可运行的二进制程序文件后,方可运行.例如C语言和Java语言. 解释运行:需要一个 ...

最新文章

  1. ATS缓存中间层介绍
  2. Yii-yiic使用
  3. 一文搞懂Raft算法
  4. python新人绘图_【python 【分享】 爬取一些二刺螈图片 (新手作图)
  5. 20165301 预备作业二:学习基础和C语言基础调查
  6. iOS开发那些悲剧的事儿
  7. android html footer 固定,前端小技巧之footer固定
  8. IDEA配置码云Gitee的使用详解
  9. 计算机用户权限设置 xp,Windows XP权限设置详解 2
  10. 毕向东java ppt下载_毕向东Java基础ppt课件
  11. apache服务器的日志文件,apache日志文件在哪
  12. 南阳oj S + T
  13. 关于电子账户开户四五要素
  14. 前端开发者思考:假如5年后你是开发总监
  15. 计算机显示屏对比度怎么调整,如何调节电脑屏幕亮度(电脑如何调节显示器亮度和对比度?)...
  16. Oracle Order by 按汉字拼音排序
  17. PPT无法打开,打开后总是修复的解决方法
  18. 为什么在CAD图纸中插入外部参照后会出现多余图形?
  19. 5.2 中心极限定理
  20. nPlayer Plus视频播放器 免越狱直装

热门文章

  1. Windows Phone 8 与 windows 8 开发技术概览
  2. 开发iOS百度地图大头针可以重复点击
  3. 输入url到页面返回的过程
  4. YJX_Driver_031_再谈SSDT_HOOK驱动保护原理
  5. 在Hadoop上安装HBase
  6. AndroidStudio_HttpServer类接收到数据以后_给Service发送Message_利用handler实现---Android原生开发工作笔记224
  7. java在线支付---06,07,08_在线支付_编写将数据提交给易宝支付的JSP页面,集成和测试向易宝发送支付请求,实现浏览器自动向易宝发送支付请求
  8. C语言小技巧之怎么找到需要的部分
  9. 2014年0417的工作计划
  10. dos, echo写文件不追加回车的方法