好的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时,使用的. 而动作指令,是在每次客户端请求时动态执行.
随机推荐
- ansible shell模块
[root@ftp:/root] > ansible ansible01 -u root -k -m shell -a 'hostname' SSH password: ansible01 | ...
- java实现多个数字求和_图形化界面
一,设计思想 1,通过简单的窗口实现多个数字的输入与输出. 2,可通过用户输入数字的数量来实现多个数字的求和. 3,定义整型数组变量number和字符串型数组变量integer,将输入的字符串变量赋给 ...
- ASP.NET-权限管理五张表
ASP.NET 权限管理五张表 权限管理的表(5张表) 每个表里面必有的一些信息 序号 名称 字段 类型 主键 默认值 是否为空 备注 1 用户ID ID INT 是 ...
- java判断string数组中是否包含某个元素
- Java相关知识(一)
1. 作用域public.protected.private以及不写时的差别? public 表示公有.声明的为公共成员变量和函数成员.在整个类内类外都可使用,对全部用户开放,能够直接进行调用 pri ...
- Woody的Python学习笔记2
Python多行语句 Python语句中一般以新行作为语句的结束符.但我们能够使用斜杠(\)将一行的语句分为多行显示,例如以下所看到的: total = item_one+\ item_two + \ ...
- Servlet学习(二)——ServletContext对象
1.什么是ServletContext对象 ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,一个web应用只有一个S ...
- asp.net 连接字符串的多种写法
一.使用OleDbConnection对象连接OLE DB数据源 1.连接Access 数据库 Access 2000: “provider=Microsoft.Jet.Oledb.3.5;Data ...
- HDU 1394 Minimum Inversion Number【 树状数组 】
题意:给出n个数,每次可以把第一个数挪到最后一个位置去,问这n种排列里面的最小逆序对数 先把最开始的逆序对数求出来 然后对于一个数a[i],比它小的数有a[i] - 1个,比它大的数有n - a[i] ...
- 路飞学城-Python开发-第二章
''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...