您的位置:首页 > 运维架构 > Shell

非程序员的GNU Emacs使用心得...... Shell Mode第4集 历史命令编辑

2010-08-09 22:50 459 查看
在日复一日的 Shell工作中,和命令行编辑一样常用的功能就是历史命令编辑了。如前所述,在软件质量测试工作中,会面临大量复杂的系统环境,并在这些系统环境里面从事大量复杂的工作。这些大量的工作虽然复杂,但是也有很多重复,其中一些重复体现在复杂应用程序的不同实例之间的重复,另外一些则体现在复杂的命令在不同的系统,不同的机器之间的重复。

Bash的历史命令编辑功能做的还是相当不错的。不仅有 ! 命令可以引用曾经执行过的历史命令,以及他们的参数,还有 ^ 命令可以对上一条历史命令进行快速编辑,这些功能都是我每天工作当中必不可少的功能,但是还有很多工作是仅仅依靠 Bash 的历史命令编辑功能难以做到的。

让我们来看一个很简单的例子,输入一条命令来启动一个每天都要使用的应用程序

bin/itmcmd agent -o QMCOD,QMCM,QMB,QMD start mq

这条命令启动了一个应用程序的4个实例,然后我输入了下一条命令检查一下他们是不是在正确运行

bin/cinfo -r


然后我需要停掉那4个实例。。。停掉他们的命令是这样的

bin/itmcmd agent -o QMCOD,QMCM,QMB,QMD stop mq


可以看到这和启动4个实例的命令仅有一字之差,就是把 start 改成了 stop,但是我却没有办法用这样的历史命令编辑功能来得到他

^start^stop

为什么呢?因为在那条 start 命令之后多了一条 cinfo 。。。看到了吗?事情就这样杯具了。。。显然我也不大可能使用 ! 命令去引用那条启动命令当中除了 start 之外的所有那么多参数。且不说输入那么多的 ! 引用本身就已经得不偿失了,事实上如果你想能够随时知道某条命令的历史编码是多少,也是需要先改一改那个 bash 的 profile设置才能做到,对吧?现在你们能够再一次体会到在自己的独占的,配置完备的,武装到牙齿的机器上工作,和在大量复杂的,各不相同的,并且随时变化的机器上工作,是完全不同的一种感受了吧?

这就是我们现实的工作环境和 Bash的设计思路之间的区别之处。从上面的例子可以看出来,Bash 提出了两种假设,一种假设认为,人们绝大多数的时候会希望在上一条命令的基础上执行一个轻微的“变种”,所以使用 ^ 命令可以非常方便快速的编辑刚刚执行过的那条条命令。另一种假设认为,人们通常需要在后续的命令里面引用,或者重用之前命令里面使用过的某些部分。

对于 Bash 的第一种假设,很不幸由于这种方法作用的距离实在是太小了,甚至很多时候有一些人仅仅是因为“手贱”敲了一个 ls,然后就永远的失去了使用 ^ 功能编辑上一条命令的机会了。对于 Bash 的第二条假设,表面上看起来来似乎具有着足够的作用距离,但是一方面来说,得到历史编码本身就是一个比较麻烦的事情,再加上在我的工作当中通常需要引用一条历史命令的绝大部分内容,只有一两个参数才有区别,这个时候使用很多的 !334:1 !334:2 !334:3 .... 就是一件很不划算的事情了,说起来还不如把那条命令重输一遍呢。

在这种时候,就还是需要 Emacs 的 shell-mode 站出来帮忙了。那么Emacs 的解决办法其实还是非常简单,就是将命令输入的控制权拿回到 Emacs里面,只是这次做的稍微有点儿不同,或者说是更加的 Emacs 一些。。。

大家都知道,Emacs 首先是一个文本编辑器,而且是一个全屏幕的文本编辑器。所以当我们将命令输入的控制权拿回到 Emacs当中之后,不仅仅是从 Shell那边夺权那么简单,同时我们还把 Shell原有的命令行编辑功能升级到了全新的“全屏幕编辑”的层次。换句话说就是在 Emacs shell-buffer 里面的所有内容其实都是可以编辑的,就和我们编辑一篇文章或者代码是一样一样的啊!

注意到 Emacs的厉害了吧?事实上在 Emacs的 shell-mode里面我只需要将光标移动到这个命令所在的位置,

bin/itmcmd agent -o QMCOD,QMCM,QMB,QMD start mq

虽然他现在已经算是 shell 当中的屏幕输出部分了,但是只要他还在 Emacs 的 shell-buffer里面,我就可以随心所欲的编辑他。移动过去之后,只需要将屏幕上的 start 简单编辑成 stop,然后敲回车,让 Emacs将编辑过的内容发送给背后的 bash,一切就万事大吉了。

Emacs 的 shell-mode还为我们提供了 comint-previous-prompt 和 comint-next-prompt 这两条命令,使我们可以方便的在 shell-buffer当中的命令行之间进行快速的移动。这两个命令通常是绑定在 Ctrl-c Ctrl-p 和 Ctrl-c Ctrl-n 这两组快捷键上面的。或者,在有些时候,由于 Thinkpad 的小红点就在键盘的最中间的位置上,所以我也时常直接使用小红点“鼠标”,将光标移动到我所希望的命令上去。

当然,话说回来了,离了张屠户,也不吃带毛的猪。Bash 也是可以完成这些工作的,但是毕竟呢,上下箭头键在键盘上的布局位置距离键盘中心区域还是太远了一些,对于这些每天都要进行无数次的工作来说,能省一秒都是相当可观的啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: