Shell笔记(二)

这次知道了GNU Readline这个库的存在。“readline – get a line from a user with editing”,这是man readline页面的介绍。用Shell执行各种任务其实都离不开Readline,它的初始化文件是~/.inputrc,如果没有就是/etc/inputrc,在这里面写的配置可以让Shell实现很多键绑定的功能,比如用某些组合键绑定某个功能或者一段文字。常用的键是Control,Meta不过一般键盘上都没有Meta,可能还要自己绑定。

基本的用法是这样的:

bind ‘”\C-k”‘: “\”ls\n\””

这么多引号其实只是为了让Shell知道命令的参数,冒号前面是用双引号引用的组合键,后面是绑定的文本,由于它也是命令所以就执行了,引号里还要用引号括起来,所以要加反斜线。

这条命令让Ctrl-k实现ls的功能。其实它就是实现了宏,所以可能Emacs里插入一段文本很方便,Vim里的话我一般是map ,t :r template.txt,但是这样前面会有空行之类的,很长时间我都是手动删除,知道后来我意识到其实在后面加几个命令就行了:map ,t :r template.txt<CR>^[kdd。

Vim里也可以!imap 就行!这里再说下?noremap和?map的区别,不加nore的说明映射可以嵌套,就是说b映射到c,a映射到b,那么输入a就会解释成c,功能更强,而前者不能多级映射,可想而知效率会高一点。所以一般还是用前者吧,虽然map可能更常见些。

对于冒号后面的功能部分,Readline里有很多命名好了的名称,这些都是在Emacs里用的,比如next-historyforward-char之类的,Emacs里的功能键其实也是用键绑定实现的。

这个bind命令是bash内置的(type bind),但是man页面里并没有它的参数说明。

-l 列出所有Readline函数(功能),共154个

-p 列出所有的键绑定,默认有四百多个,有的未启用

-P 列出各个功能绑定到了哪个键上,155个

怎么会多了一个出来呢,蛋疼的我又找了下两个输出的结果:

bind -l>l

bind -P|awk -F” ” ‘{ print $1;}’|sort>P

vimdiff l P

结果发现它们只差了一个空行。

-v 列出变量名称,-V和它差不多,共有34个Readline变量,就是editing-mode之类的,是一些开关或者需要有限具体的值的变量。

对于-p参数列出来的绑定,未启用的是用#注释掉的(大部分是和vi有关的功能,所以如果要把bash换成vi模式还要自己花好多功夫和经验),我想把注释的和未注释的分开,怎么办呢?我首先想到了Vim,因为我就是用它打开输出结果文件的。sav发现不能指定范围,而我刚好看到:g的功能,就是找到所有匹配的行,想着能把它显示的结果保存下来,结果失败了。我需要的功能是根据一个正则表达式把过滤的内容到另一个文件里,于是就用到了w和grep,因为w正好有一个可以在后面加系统命令的功能,这个功能我第一次是在这里看到的。受此启发,我很快写出了这个命令:

:w !grep ‘^\#’ |tee bp

‘#’号需要转义的,这是试出来的(vim里不需转义但因为这里要与Shell交互),那么多正则流派又那么多环境还有那么多符号和规则都记住岂不是要死人。

再回到:w !sudo tee %的例子,第一次看的时候根本没理解,现在明白了,原理其实很简单啊。感叹Vim的设计者,刚刚好有各种需要的功能。最近还是有些感受的,感觉设计一个就算是功能很有限的程序也会有很多问题出现,需要设计者实现想好尽可能多的情况,另外要对所有的元素和他们之间的联系有很好的把握,才能做出最好的判断做出最实用的功能。

总结一下,是自己闲的蛋疼,没事找事(内心烦躁,感觉其实我学这些虽然自己感到有趣但是别人并不这样看,别人只看你能不能做出个图形界面能不能开发个Android程序,然而我觉得学图形界面就是学一些别人定好的框架,没有任何新东西没有任何实用之外的价值尽管我还没学过我没有资格评价或许我真的有点偏激和固执了我不知道这样下去是不是后果很严重因为,我自己觉得有用的东西学得还不精没有竞争力,又不想学简单的东西最后可能什么也干不好所以得找个时间好好反思一下了放弃还是继续必须选择其一),不过还是弄明白了一些问题学到了一点点知识,可以写下笔记记录下了。

等等,为什么要在Vim下蛋疼得调用系统的grep,直接用grep不行吗。

cat bindp|grep ‘^#’>bp2

问题同样很好得解决。这个方法我开始写这篇文章的时候还没想到。看来一定的总结还是有好处的。不过这样一来就显得这个问题太简单了似乎不值得花费这么多精力。

Anyway,权当自己无聊,在没有人在乎的各种古老的工具中发现没有人关心的问题然后自己解决问题,由于问题过于简单而且看起来毫无用处,同样没有人在乎你干了什么。