我们每天都在使用前人开发的各种工具。

一款好的工具能无缝地融入到你的工作环境中,而一款“差”的工具经常须要花费额外的精力才干集成到你的工作环境中。

(注意:这里的差是指用户体验方面的问题,但这些工具本身还是实用的)。作为project师,我们总是须要开发一些工具给自己或者给别人用。

Marius Eriksen的这篇文章(http://monkey.org/~marius/unix-tools-hints.html)讲了设计Unix工具须要注意的地方。

须要说明的是。这篇文章讲的是开发Unix工具方面的建议,主要是使之能非常好地和经典的Unix工具能非常好地集成在一起。所以里面的建议可能不适用于别的场景。

本文把Marius的文章简单总结了一下,以飨读者。

一、从标准输入(stdin)中读取数据。将结果输出到标准输出(stdout)。


换种说法,你的工具应该是个过滤器,从而它能非常easy地被集成到shell的管道中去,就能和Unix的非常多工具在一起工作了。



二、输出的结果中最好不要有header或者其它装饰性输出


假设使用你工具的人须要解析工具的输出结果。输出结果中包括太多这样的装饰性输出会使得解析工作变得复杂。



三、输出的结果要能easy解析


结果中的每条记录最好是单行。纯文本的输出,每条记录中的列用空格或者TAB切割(请不要用JSON格式输出)。

由于那些经典的Unix工具,比方sort。grep。sed都是假定输入是这样的格式的。



四、把工具的输出看成是工具的API


对API来讲。非常重要的一点就是要保持其稳定性。假设你的工具的输出格式变化了的话。其它依赖于你的工具就可能挂掉。



五、把诊断信息输出到标准错误(stderr)


诊断信息包含进度信息,调试信息,日志,错误和用法,这些信息不是你工具的主要输出信息。

假设诊断信息和数据混在一起的话,会使得工具的输出结果难以解析。

把诊断信息输出到stderr的另外一个优点是,当你对数据进行过滤或者重定向的时候,这些诊断信息还是会完整地输出到屏幕上。



六、用退出状态码来标记错误


假设你的工具执行失败了,应当把退出状态码设为一个非0值。这使得你的工具可以非常好地和别的脚本集成在一起。我想这点应该是没有争议的。



七、输出内容中尽量包括完整信息


输出内容中不可避免地会包括一些上下文或者环境信息,比方机器名。文件路径等。好的工具的输出应尽量提供完整的信息,比方用绝对路径和FQDN。这样就仅仅须要少的上下文信息就能理解输出内容了。比方,假设输出包括文件的相对路径,那么就须要知道当前的工作文件夹是什么才干知道相应的文件在哪里。



八、避免过多没用的诊断信息


不要在正常的情况下输出过多的诊断信息。假设非要这种话,把诊断信息输出到stderr。同一时候放在verbose模式,默认不开启verbose模式。



九、避免用户交互


好的工具应当避免用户交互,这使得工具可以被cron调度,或者在远程机器上运行。须要交互的工具会很难以地和其它工具集成。假设非要提供交互模式。请也一定提供silent模式。

须要用户交互的场景可能有让用户确认一个危急的操作。在这样的情况下能够让用户指定一个特定的參数,比方git中删除一个branch是用git branch -d。

当branch上有commit没有合并的时候,想要强制删除分支就要用git branch -D。

能够看到,上面的建议主要是关注在怎样使得工具能和别的工具整合在一起是用,怎样使得工具的输出能更好地被解析。假设在开发工具的时候考虑这些建议。你的工具会更优秀。

假设想了解最新的技巧。请关注微信公众号“project师的那些事”



好的Unix工具的九大启发的更多相关文章

  1. JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象

    1 什么是JSP   1)为什么说,Servlet是一个动态Web开发技术呢?     Servlet是基于服务端的一种动态交互技术,     HttpServletRequest表示客户端到服务端的 ...

  2. Linux/Unix工具与正则表达式的POSIX规范

    http://www.infoq.com/cn/news/2011/07/regular-expressions-6-POSIX 对正则表达式有基本了解的读者,一定不会陌生『\d』.『[a-z]+』之 ...

  3. 【分享】改变未来的九大算法[pdf][清晰扫描版]

    [下载地址]http://www.colafile.com/file/1179688 图书信息:中文名: 改变未来的九大算法作者: 约翰·麦考密克译者: 管策图书分类: 软件资源格式: PDF版本: ...

  4. 【串线篇】SpringMVC九大组件

    SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean.FrameworkServlet和 DispatcherServlet. HttpServletBean直接继 ...

  5. JSP页面以及JSP九大隐式对象

    €JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. €JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...

  6. android ListView 九大重要属性详细分析、

    android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...

  7. jsp学习--JSP运行原理,九大隐式对象和JSP常用标签

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  8. JSP九大隐式对象

    JSP九大隐式对象 request HttpServletRequest response HttpServletResponse session HttpSession application Se ...

  9. jsp笔记,包括编译指令和动作指令,九大对象等

    jsp基础知识 不包括HTTP协议,只有jsp的基础知识,包括表达式,代码片段,jsp九大对象等. 编译指令是在jsp被转换成selvet时,使用的. 而动作指令,是在每次客户端请求时动态执行.

随机推荐

  1. Java并发和多线程3:线程调度和有条件取消调度

    在第1篇中"并发框架基本示例",提到了Executors和ThreadPool.其中,还有个"定时调度"的方法,Executors.newScheduledTh ...

  2. HDU 4372

    想了很久,终于想到了.... 向后看到F,向前看到B,假如把N-1个楼分成F+B个组,则把每个组最高的楼作为看到的楼,那么,其实在确定每一组的最高楼时,左边或右边的最高楼的顺序已经确定了.由于是排列数 ...

  3. HDU 4165

    一块药看成括号配对就行了.很明显的直接求卡特兰数. 今晚看了HDU 3240的题,有一点思路,但无情的TLE.想不到什么好方法了,看了别人的解答,哇...简直是天才的做法啊....留到星期六自己思考一 ...

  4. ZOJ 3556

    终于做出来了,激动.... 这道题隐藏得深啊,但若推导下来,就变简单了. 首先,一个集合的子集的个数为2^n=s.注意了,题目求的是有序集合组,并且每个集合是可以重复使用的,怎么办呢?这就要想到多重集 ...

  5. Cocos2d-x 多点触摸

    多点触摸的实现步骤与单点触摸类似,setTouchEnabled(true)开启触摸功能,注冊触摸事件,重载多点触摸函数:ccTouchesBegan(開始).ccTouchesMoved(移动).c ...

  6. nyoj 628 小媛在努力 【搜索】

    第一次是直接建一个10^7的数组 结果  内存大的要死.! 是不是能够不建数组 这下好了 小媛在努力 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 在多媒体数据处理 ...

  7. 操作系统 之 哈希表 Linux 内核 应用浅析

    1.基本概念         散列表(Hash  table.也叫哈希表).是依据关键码值(Key  value)而直接进行訪问的数据结构. 也就是说,它通过把关键码值映射到表中一个位置来訪问记录.以 ...

  8. iOS 从各种效果图颜色标注生成 UIColor

    iOS 从各种效果图颜色标注生成 UIColor 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...

  9. 归并排序(Python)

    一.采用分治策略:将原问题划分成n个规模较小的但结构和原问题相同的子问题,递归解决这些子问题后合并各个结果从而得到原问题的解. 二.分治策略的步骤: 分解:将原问题分解成一系列子问题 解决:子问题粒度 ...

  10. 如何用Android studio生成正式签名的APK文件

    必须签名之后才可以发布到app商店中. 平时的调试的app都有默认的签名. 下面是生成带签名的APK的步骤: 1. Build 选择 Generate Signed APK 2. 弹出框,第一次选择C ...