已经有将近一个月没有更新简书了,这一个月其实有够忙的。找新实习、辞职、往外租房、再租帝都的房子。今天总算来到帝都,收拾好了住处。之前说好的要写一个系列,才仅仅有一篇讲Macbook的,实在是觉得欠了太多债。本来一个月前就打算写这篇关于shell的,但是觉得shell这玩意我了解的不多,也没用来大段编写过代码,就搁置了一段时间。今天在想起来,Unix下的shell编程虽然涉及的少,但是可以讲讲终端中发生的各种有意思的用法。所以今天来再开一篇,Shell。
江湖有传言,shell和正则表达式是程序员的任督二脉,打通二脉者功力大增。然而,小弟功力尚浅,仅仅对linux的基本命令有些了解,正则表达式却还没什么进展。那就只能从了解的shell开始讲起了。上一章讲到,Macbook对程序员来说,最吸引人的点之一就是黑底白字的Terminal。程序员或多或少都和linux打过交道,不论是在服务器上真刀真枪的修改线上配置,还是曾经求学时候捧着一本鸟哥对着linux虚拟机狂敲ls。
有人认为shell所代表的是麻烦的、复杂的、不优雅的unix操作系统。这话只能说是对了一半,shell可以一定程度上代表unix,不过unix并不是那么的不堪。
相反,shell和linux是极其简单且灵活的。
这对很多人来说是不可能的。你说shell简单怎么还需要学那么久?还需要那么厚的工具书堆在桌子旁?很对,linux就是需要学很久,但是它很简单。这种奇怪的感觉,是由于故意用了一个模糊的中文词汇而引起的误会。其实,我所说的简单,和要学多久的那个难易不是一个东西。简单的说,一个是易学/难学、另一个是易用/难用。打个比方,在一块布上以一种手法绣上一条线,是很易用的一件事。但是组合多种多样的手法,飞针走线,可以做出各种精美的刺绣,精美的十字绣,各种昂贵的工艺品。单一的事情总是简单的,但是把他们组合起来所能发挥的力量是无穷的。都是把基本的手法、命令组合起来,以任何形式组织成自己喜欢的新工具。
举两个曾经接触过的shell的用法:
- mac上安装mysql由于安装的方式不同,可能在各个不同的文件夹下都有mysql的文件。所以,想要确定把mysql删除,就有一个脚本是删除所有可能安装mysql的位置的文件夹。这也是最常见的用法,基于某种业务,构成的业务流程。
- 在用java写业务的时候,需要调用一个类的全部set方法,但是。。就算用IDE,有代码提示,我也记不住我之前对那些属性set过。所以我会用 grep set **.java | vim - 这个命令,把所有的set命令抓到一个vim的临时文件中,再借用vim的区域选择等工具批量处理这些行。再把这些行复制到需要的地方。虽然看起来有些麻烦。但是完全不用记有那个属性调整过了,哪个属性没调整。也算是稳定的一种做法吧。这种是属于利用shell在需要的场景,来处理不同的材料。
unix本身的管道设计,使得每一个工具都是完整独立的。但是功能又都是不重复的。这样是一个最轻量的工作集,基于这个工作集可以完成任何基于这个工具集衍生出来的工具所能完成的任务。这也是unix哲学的一部分。