好的Unix工具的九大启发
我们每天都在使用前人开发的各种工具。
一款好的工具能无缝地融入到你的工作环境中,而一款“差”的工具经常须要花费额外的精力才干集成到你的工作环境中。
(注意:这里的差是指用户体验方面的问题,但这些工具本身还是实用的)。作为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工具的九大启发的更多相关文章
- JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象
1 什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的 ...
- Linux/Unix工具与正则表达式的POSIX规范
http://www.infoq.com/cn/news/2011/07/regular-expressions-6-POSIX 对正则表达式有基本了解的读者,一定不会陌生『\d』.『[a-z]+』之 ...
- 【分享】改变未来的九大算法[pdf][清晰扫描版]
[下载地址]http://www.colafile.com/file/1179688 图书信息:中文名: 改变未来的九大算法作者: 约翰·麦考密克译者: 管策图书分类: 软件资源格式: PDF版本: ...
- 【串线篇】SpringMVC九大组件
SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean.FrameworkServlet和 DispatcherServlet. HttpServletBean直接继 ...
- JSP页面以及JSP九大隐式对象
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- jsp学习--JSP运行原理,九大隐式对象和JSP常用标签
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JSP九大隐式对象
JSP九大隐式对象 request HttpServletRequest response HttpServletResponse session HttpSession application Se ...
- jsp笔记,包括编译指令和动作指令,九大对象等
jsp基础知识 不包括HTTP协议,只有jsp的基础知识,包括表达式,代码片段,jsp九大对象等. 编译指令是在jsp被转换成selvet时,使用的. 而动作指令,是在每次客户端请求时动态执行.
随机推荐
- Linux赛车游戏 SuperTuxKart 1.0 正式发布
SuperTuxKart是一款受Mario Kart(马里奥赛车)启发并以Linux/Tux为主题的开源赛车游戏,经过12年多的开发,已经达到1.0版本.并且确定这个版本确实是一个重要的里程碑. Su ...
- 2019-03-18 Python time 将2015年11月20日转换为2015-11-20
#ReportingDate = soup.select('body > div.main > div > div.ctr > div.recruit > ul > ...
- C语言 将十六进制字符串转为十六进制数 (二进制、十进制都适用)
主要利用 long int strtol(const char *nptr,char **endptr,int base); 函数 函数说明: 参数base范围从2至36,或0.参数base代表采用的 ...
- strlen()函数对一个未初始化数组的处理
今天使用strlen时 ,发现一个问题,demo代码如下: #include <stdio.h> #include <stdlib.h> #include <string ...
- 数组实例的 entries(),keys() 和 values()
数组实例的 entries(),keys() 和 values() entries(),keys()和values(),用于遍历数组.它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一 ...
- 题解 P1337 【[JSOI2004]平衡点 / 吊打XXX】
这道题调了好久,果然非洲人是得不到眷顾的吗... 本题采用模拟退火解决. 模拟退火是一种简洁明了而又高效的近似算法,基本上可以套到任何求最优解的题目上去. 它的原理是模拟物理中金属退火的现象,凭借选手 ...
- ASP.NET-未解决的问题
001.((FormsIdentity)User.Identity).Ticket.UserData 用ASP.NET后台格式化成json数据后传回去的数据有"这样的符号 002.HT ...
- jquery让 readOnly失效的方法
re.attr("readOnly","true"); re.attr("readOnly",false); 注意 :false不能带引号
- 查看系统的I/O使用iostat命令而使用iotop能够依据I/O统计信息排序,追踪到详细的进程
当看到I/O等待时间所占CPU时间的比重非常高的时候,首先要检查的就是机器是否正在大量使用交换空间,由于硬盘操作的速度远远低于RAM.所以当系统内存耗尽,開始使用交换空间的时候.系统的性能会受到严重影 ...
- ZOJ 3687
赤裸的带禁区的排列数,不过,难点在于如何用程序来写这个公式了.纠结了好久没想到,看了看别人的博客,用了DFS,实在妙极,比自己最初想用枚举的笨方法高明许多啊.\ http://blog.csdn.ne ...