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

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

(注意:这里的差是指用户体验方面的问题,但这些工具本身还是实用的)。作为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. url中jsessionid的理解

    (1) 这是一个保险措施 因为Session默认是需要Cookie支持的 但有些客户浏览器是关闭Cookie的 这个时候就需要在URL中指定服务器上的session标识,也就是5F4771183629 ...

  2. 【codeforces 799D】Field expansion

    [题目链接]:http://codeforces.com/contest/799/problem/D [题意] 给你长方形的两条边h,w; 你每次可以从n个数字中选出一个数字x; 然后把h或w乘上x; ...

  3. oracle学习之第一个存储过程:打印Hello World

    数据库对象:表.视图.索引.序列.同义词.存储过程.存储函数 存储过程:指的是存储在数据库中供全部用户程序调用的子程序叫存储过程.存储函数 存储过程和存储函数的同样点:完毕特定功能的程序 存储过程和存 ...

  4. QT5 OpenGL (六, 键盘事件, 开关灯,放大缩小综合运用)

    概要 实例效果图 立体图放大图 立体图缩小图 不加矢量开灯图 不加矢量关灯图 加矢量关灯图1 加矢量关灯图2 部分代码展示 主要内容解析 QT键盘事件 立体图形的放大和缩小 上下左右键以及A键D争键控 ...

  5. Cocos2d-x 3.4 之 消灭星星 > 第三篇(终) <

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  6. JS 控制checkbox 获取 全选 全不选 一行不选择全选则不被选择 所有选择全选被选择

    //点击全选button的事件操作 function selectAll(){ var allcheckBoxs=document.getElementsByName("iTo") ...

  7. bzoj3436: 小K的农场(差分约束)

    3436: 小K的农场 题目:传送门 题解: 查分基础: t==1  a>=b+c t==2  b>=a-c t==3  a>=b+0 b>=a+0 跑最长路一A 代码: #i ...

  8. 高级程序员与CTO技术总监首席架构师

    一.高级程序员 如果你是一个刚刚创业的公司,公司没有专职产品经理和项目经理,你就是公司的产品经理,你如果对你现在的开发员能力不满,那么你只需要的是一个高级程序员. 你定义功能.你做计划推进和管理,他可 ...

  9. [codeforces 852 D] Exploration Plan 解题报告 (二分+最大匹配)

    题目链接:http://codeforces.com/problemset/problem/852/D 题目大意: 有V个点,N个队伍,E条边,经过每条边有个时间,告诉你初始N个队伍的位置,求至少有K ...

  10. HD-ACM算法专攻系列(6)——Big Number

    题目描述: 源码: #include"iostream" #include"cmath" using namespace std; #define PI 3.1 ...