当纯文本命令行碰到图形界面

很多人对很多事都会表现得很狂热。比如我自己,曾经一度说过这样的话:“我最 爱的是自由软件,最讨厌的是微软公司”。过了几年,有一次我把自己搞失业了, 居然去找在微软工作的同学说,嘿,哥们,能不能帮我推荐一下xxxx号职位?

这不是打自己脸么?

从那之后,我再也不敢轻易地说那种不知深浅的话了。其实微软的东西挺好的。

回到这篇文章的题目,命令行和图形界面。这两种界面特点非常鲜明,可以说水 火不相容。

命令行的优点是高效率。几乎可以完全用键盘操作;魔鬼筋肉人可以最大程度地 利用手指肌肉的机械化记忆而达到非常快的速度;头脑发达的可以组合使用各种 命令行工具达到自己的目的;最后非常容易自动化。

图形界面的优点则是直观。不是有句话叫一图抵千言么。一千个字写得累看得也 累;画一张图可能画得有趣看得也轻松。

而它们的缺点则刚好正是对方的优点。命令行用久了容易累,纯文本的东西需要 吸收消化,对脑子转速要求比较高;图形界面用久也容易累,因为它比较难自动 化,很多操作需要用鼠标完成。

由此带来的一个现象是,爱用纯文本界面的人,对图形界面常嗤之以鼻,认为那 是给脑子不够用的人使的;爱用图形界面的人,往往不知道还有命令行这回事。

其实就像男人和女人,往往只有当他们相遇一起的时候,才会产生更美好的东西: 爱情。

下面简单介绍几个我用过(写过)的结合命令行和图形界面的小程序。

1 抛绣球(of/oc)

of 这个命令是open file的意思,通过这个命令我可以在命令行上打开某个文 件,在Windows上cmd.exe下有个start命令有相同的功能,Cygwin里模访了一下, 有一个cygstart程序。注意,start在cmd.exe里是一个内置的命令,你在文件系 统上找不到一个对应的start.exe或start.com(能找到的话也是跟这个命令风马 牛不相及的);而cygstart则是一个独立的.exe程序文件。在Linux下的话就更 多了,好像有一个叫xdg-open,也有叫gnome-open的等等。在Mac下则有一个 /usr/bin/open命令。

通过这个 of 命令的话,我就不需要从文件管理器的(我的电脑)文件夹开始 一层一层找到我的文件所在的目录,再找到我想要到文件(有时万一这个目录下 有成百上千几万个文件的话,作为一个男人,我会很不争气的有一种想哭的感觉) 然后双击打开它。

然后这个 oc 的话就是open containing folder的意思。在Firefox下如果你 下载了一个文件你可以右键点击这个下载的文件,这时会弹出菜单,里面有一个 菜单项叫做“打开所在的文件夹”,点了之后会打开这个新下载的文件所在的文件 夹,注意!一打开之后默认就会选中这个文件。

我现在这个 oc 命令用的比较少了。但是 of 还是很有用的,通过它我不需 要去记比如一个网页是什么用firefox打开,一个pdf文件的是用acrobat打开, 那么这样子的话我就不需要记那么多的文件和相应的命令之间的对应关系,所以 觉得这个命令是非常有用的,至少在命令行上的使用效率相当的高。

这两个命令就像是男女之间抛绣球一样,哎我扔个球出来你接着,我扔个文件出 来你给我打开😄

2 小姐,能不能给我你的电话号码(up/swp)

关于这个 up 就是Unix Path的意思,在命令行上我打一个 up 后面跟一个 比方说当前文件夹下面某个文件的名字(注意!是有补齐和通配符的哦,很方便 耶),它就能帮我把这个文件的全路径放到剪贴板里去。关于这个 swp 则是 samba windows path 的意思,在Linux下我通过smbnetfs加载了Windows的一个 共享目录,然后我用swp了就可以获得其下某个文件的Windows共享目录格式的路 径,放到剪贴板里,然后我可以通过邮件粘贴这个路径去跟同事们分享。或者我 在Firefox里发个微博要上传图片时,我直接粘贴一下路径就可以了,不用一层 一层去找。

反过来在Windows或者Linux的文件管理器里,通过修过系统注册表(Windows) 之类的办法,我可以点一个文件然后右键菜单中增加一个比方说叫 up 的菜单 项,点一下就把这个文件的全路径放到剪贴板里,然后我可以很方便地把这个路 径粘贴到我的命令行窗口上,打开这个文件、或者可以很容易的改变我的目录cd 到那个文件的目录下、或者用一些别的命令来处理这个文件、我还可以把它粘贴 到我的邮件里去。这个用过UltraEdit的同学可能会有点印象,文件管理器里会 多出一个“用UltraEdit打开”的右键菜单项。

这些命令是不是就像男女之间互相写情书?

2.1 剪贴板的更多用途

剪贴板真的是一个很好的媒婆一样的角色,为命令行和图形界面起到一个穿针引 线的作用。你在命令行上操作剪贴板在不管那个平台下都是有办法的,在 Windows下你可以通过安装Cygwin获得一对叫putclip/getclip的程序。然后在那 个Linux下的话有一个叫xclip的程序,在Mac下则有一对pbcopy/pbpaste程序。 我在bash底下定义了一个快捷键可以把当前输入的这一行文本直接放到剪贴板里 去,这样的话我跟同事共享一下我的小命令是非常有用的可以直接粘贴到我的邮 件里去发送。在 这篇博客 里我也提到了我对putclip/getclip的一些跟Emacs有 关的改动。

3 不爱了,把它们全干掉吧!

一般我们比方说图形界面的程序出了一点问题什么的情况下我们可能会想要那个, 重头来过,reboot或者logout。一般Linux下只要logout就可以了,但logout的 操作你需要用鼠标去点,另外的话你可能还需要去等待所有程序被关闭。所以我 自己的话在命令行上直接退出图形界面的方法是非常简单粗暴的,将所有属于我 自己的进程全部kill掉😄 。

这个命令是这样的:

sudo setsid bash -c 'ps -eo user,pid|grep bhj|pn 2|xargs kill'&

这里面sudo是为了让这个脚本本身跑到root用户底下去,不是为了要得到root权 限才能kill——都是我自己的权限,都可以kill的——而是为了不要误伤到自己这个 终结者进程:终结者,去,把所有bhj的进程都干掉。OK,终结者自己也是bhj的 进程,先把自己给干掉的话就太二了。

Setsid也是差不多的意思,只用sudo是不够的,因为终结者的父进程被干掉的话 在终端上它们属于一个session的,终结者本身也是要一起毁灭的。

最后有一个 & 字符,你可以猜猜是什么目的?猜到的话我可以请你喝咖啡😊。 注意,我要的答案不是“为了把这个程序放到后台”,这不是我的目的。