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

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

(注意:这里的差是指用户体验方面的问题,但这些工具本身还是实用的)。作为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. vi 编辑器的日常使用

    命令行模式: 光标管理 text  屏幕 行 单词 gg 跳转到文档头部 H 跳转到屏幕首行 ^  或 数字0 跳转到行首 w 向前 G 跳转到文档尾部 M 跳转到屏幕中行 $ 跳转到行尾 b 向后 ...

  2. 实现双向数据绑定mvvm

    实现双向数据绑定mvvm  

  3. linux mint(Ubuntu、Debian) 18修改环境变量

    修改环境变量 sudo gedit /etc/profile sudo gedit /etc/profile 在profile文件的末尾添加以下代码 export JAVA_HOME=/usr/lib ...

  4. vim 跳转指定行

    在编辑模式下输入 ngg 或者 nG n为指定的行数(如25) 25gg或者25G 跳转到第25行. 在命令模式下输入行号n : n 如果想打开文件即跳转 vim +n FileName 查看当然光标 ...

  5. ASP.NET-DropDownListFor绑定model数据

    在ASP.NET中,DropDownListFor绑定model数据比用html的select方便太多了,配合listmode这种模型集合就可以在controller里面直接foreach循环处理li ...

  6. 多线程003 - 再谈CyclicBarrier

      java.util.concurrent.CyclicBarrier也是JDK 1.5提供的一个同步辅助类(为什么用也呢?參见再谈CountDownLatch).它同意一组线程互相等待,直到到达某 ...

  7. Mongodb简单介绍

    1. 简单介绍 Mongodb是一种强大.灵活,可扩展的数据存储方式.属于nosql.非关系型数据库的一种. mongodb是面向文档的数据库. 尽管是非关系型数据库.可是它保留了很多关系型数据库的特 ...

  8. 【LeetCode-面试算法经典-Java实现】【058-Length of Last Word (最后一个单词的长度)】

    [058-Length of Last Word (最后一个单词的长度)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string s consis ...

  9. hdu 2079 选课时间(题目已改动,注意读题) (母函数)

    代码: #include<cstdio> #include<cstring> using namespace std; int main() { int t; scanf(&q ...

  10. HTML5客户端数据存储机制Web Storage和Web SQL Database

    引言 html5本地存储可以选择两种方式,一种是本地存储,一种是sqlite. 比如开发html5的购物车功能,就可以考虑选择其中之一,进行本地存储与操作. 又或者保存用户登录信息,可以使用local ...