Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

Bash readline 使用技巧

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]
作者: 王垠

Bash readline 使用技巧

很多人会用 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。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:webalizer汉化后图表乱码的处理   下一篇:coda分布式文件系统的安装和配置

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号