Linux 命令行下的好东西( 二 )

.com:/var/www/siteaspell
作为一个程序员你总有一天会要写英文文档 。我等母语不是英文的出现拼写错误实在是太正常了 。如果你用 word 的话会有下划线提示你,但如果你是在代码里写注释或者再 Linux 下写 markdown 的话好像就没什么办法 。事实上这也是一个已经被解决的问题,aspell 正是来做这个的 。aspell 可以对任何纯文本进行拼写检查,作为面向程序员的工具它可以侦测文件类型,比如对 C++ 程序它就只检查注释里的单词 。
tee
有时候某些命令运行的结果会很长,你可能会用 less 来上下看 。再或者你可能会用 > 来重定向到文件里 。但某些时候程序有可能需要你输入 y 来确认,或者某些程序运行的时间很长,仅仅重定向的话又不太确定是不是它在正常运行 。tee 就能做到又输出到屏幕上,又同时重定向到文件 。一个简单的例子:
$ echo waht | tee out.txtwaht 会被输出到屏幕上,同时也会被写到 out.txt 文件里 。另外 tee 的意思其实是 T,把输入输出中间拉了又多扯出了一条,可谓是相当形象 。
值得一提的是 vim 也可以用在 pipe 里,例子如下:
$ echo waht | vim -<ctrl+r>
你肯定知道用键盘上下方向键可以来回找你的历史,那么比如有一个很久之前打过的命令你可能需要猛按上才能找到 。其实这时候只要输入一部分然后按 <ctrl+r> bash 就会帮你往回搜索 。连续按 <ctrl+r> 可以按顺序往前搜 。(或者直接按 <ctrl+r> 再进行输入) 。接着上面一个的例子,输入 echo 后按 <ctrl+r> 效果如下:
(reverse-i-search)`echo': echo waht | vim -有往前搜索那么一般就有往后搜索 。可惜的是往后搜索的快捷键是 <ctrl+s>,如果你试着按一下的就会发现...好像机器没反应了 。这个是因为 <ctrl+s> 大部分情况下默认是 XOFF,代表暂停接收输入 。按 <ctrl+q> 就能恢复 。当然你可以把向前搜索绑定到别的键上,请自行搜索
cloc
虽说代码行数不能说明任何问题,但有时候不知为什就是想知道 。cloc 能精确的计算代码行数,把注释和空格都区分开 。如果你是一名传说中的项目经理的话,从今天起开始用 cloc 给你手下的码农算工资吧!下附截屏:
$ cloc /usr/include/ 9628 text files.9308 unique files.434 files ignored.T=39.0 s (227.6 files/s, 39948.2 lines/s)-------------------------------------------------Language files blank comment code-------------------------------------------------C/C++ Header 8875 217366 287013 1053368Teamcenter def 1 48 0 186-------------------------------------------------SUM: 8876 217414 287013 1053554-------------------------------------------------printenv
用 set 可以查看所有的 Shell 变量还包括 Shell 函数,但是其中有一些是仅仅在当前 shell 里其作用的 。而往往你需要找的是通过 export 来定义的环境变量 。printenv 就是用来做这个的 。
set -o vi
bash 或者可能绝大多数常见 shell 其实都是支持用 vi 的方式进行命令行编辑的,比如设置了 set -o vi 后你就可以用熟悉的 hjkl 来移动,用 w, b 来跳过单词等等 。
同样的如果你设置了 EDITOR 环境变量的话,输入 fc 就可以把之前输入的命令行放到编辑器里来编辑,只要保存了的话就会执行 。相反的放弃保存就等于是放弃 。
find
我把上面说到的那本书仔细看过以后,最大的收获之一就是终于学会了用 find 。这个现在变成了我几乎每天都在用的一个命令 。比如说我要把目录下所有的 png 文件加入到这次的 git commit 里面,我可以用:
find . -name '*.png' -exec git add {} ';'如果你熟悉 find 的话你会知道最后的 ; 可以换为 + 会更好,但用它就是有目的的 。这个命令虽然看起来很简单,但里面的单引号省略或者换成双引号命令都是会失败的 。这些牵涉到 "shell variable expansion" 和引号的 escape 规则,虽然感觉很恼火但其实这些只有几个简单的规则,而且一致性非常好 。所以只要你肯花点时间把相关东西弄清楚,这种简单的问题就可以轻松搞定 。
type
如果 foo 是一个命令行里可以直接运行的程序的话,你应该知道用 which foo 可以找到 foo 的可执行文件路径在那里 。但在命令行里可以执行的命令并不一定都对应到某个可执行的文件,它可以是 alias, shell 自带的函数和用户自己的函数等等 。所以有时候用 which 找到不到东西的时候会让人很疑惑 。其实你可以用 type foo 看看 foo 到底是什么类型的 。


推荐阅读