当前位置:中国星空学习网首页>Linux/DOS>Linux基础>正文  
Bash readline 的使用技巧 (1)

 

很多人会用 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/browsermv ~/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种语句:

1.注释

2.变量设置语句(set variable value)

3.键定("keyseq":function)

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

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

键绑定

1.绑定语句。

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

"\C-w":kill-region


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

3.列出可用的函数。

不过你怎么知道那些函数可以被绑定呢?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-functionsdump-variablesdump-macros


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

4.如果忘了绑定……

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

$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.......


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

配置变量

1.体验:

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 的到的结果。

2.设置:

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

set visible-stats on


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

3.怎样知道有哪些设置?

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

$bind -v


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

(责任编辑:战莹)j30B0j30B0j30B0

 

上一篇: 分析SpenceMurray的开发技巧 (1)
下一篇: 认识Linux文件系统(二)
站内公告
栏目导航
 Windows系统
 Linux/DOS
 办公应用
 工具软件
 图形图象
 网络应用
 安全防御
 网络编程
 软件教程
 实用技术
最新文章
中国星空图片网
·人体艺术
·性感美眉
·生活自拍
·幽默搞笑
·超级帅哥
·精彩万花筒
·梦幻景色
中国星空探索网
·神秘追踪 灵异接触
·鬼故事 灵异空间 图片
·未解之谜 探索宇宙
中国星空两性网
·两性图文 我的性事 情人 成人幽默
·性爱技巧 两性测试 性爱误区
·性事花边 生育避孕 性保健 性疾病
·两性生理 文化 讨论 心理 知识
·爱人同志 非常男女 一夜情
中国星空算网命
·手机吉凶 QQ号码吉凶 周公解梦
·塔罗牌测试 狗年运程
·关公灵签 紫薇斗数 八字排盘
·测试:你的成功指数有多少
·测验你的家庭是否美满?
·面相: 面型 眼睛 耳朵 口唇
·手相:拉你一把奶油桂花手
·测试:你能成为大富翁吗?
联系方式 设为首页
中国星空旗下---中国星空学习网    Copyright 2005-2050 Year   xx.happy369.com  Networks.All rights reserved
中国星空网所有内容均来源于网络,版权属于原作者,如侵犯到您的权益,请与我们联系,我们将尽快予以删除或处理。
中国星空不承担由于内容的合法性及健康性所引起的一切争议和法律责任。
陕ICP备05011765号 联系我们 
《女人如烟》--演唱:魏佳艺