在日複一日的 Shell工作中,和命令列編輯一樣常用的功能就是曆史命令編輯了。如前所述,在軟體品質測試工作中,會面臨大量複雜的系統內容,並在這些系統內容裡面從事大量複雜的工作。這些大量的工作雖然複雜,但是也有很多重複,其中一些重複體現在複雜應用程式的不同執行個體之間的重複,另外一些則體現在複雜的命令在不同的系統,不同的機器之間的重複。
Bash的曆史命令編輯功能做的還是相當不錯的。不僅有 ! 命令可以引用曾經執行過的曆史命令,以及他們的參數,還有 ^ 命令可以對上一條曆史命令進行快速編輯,這些功能都是我每天工作當中必不可少的功能,但是還有很多工作是僅僅依靠 Bash 的曆史命令編輯功能難以做到的。
讓我們來看一個很簡單的例子,輸入一條命令來啟動一個每天都要使用的應用程式
bin/itmcmd agent -o QMCOD,QMCM,QMB,QMD start mq |
這條命令啟動了一個應用程式的4個執行個體,然後我輸入了下一條命令檢查一下他們是不是在正確運行
然後我需要停掉那4個執行個體。。。停掉他們的命令是這樣的
bin/itmcmd agent -o QMCOD,QMCM,QMB,QMD stop mq
|
可以看到這和啟動4個執行個體的命令僅有一字之差,就是把 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 也是可以完成這些工作的,但是畢竟呢,上下方向鍵在鍵盤上的布局位置距離鍵盤中心地區還是太遠了一些,對於這些每天都要進行無數次的工作來說,能省一秒都是相當可觀的啊。