命令行程序设计的最佳实践

因为长期使用 linux 系统, 使用大量的 linux 命令。 我发现命令行参数的设计似乎遵循这某些设计哲学。比如,当你使用一个新的命令的时候,如果你不太熟悉某个参数,你可能会这样:

1
command -h

或者

1
command --help

或者

1
command help subcommand

你会使用 -h 或者 --help 查看帮助 , 使用 help 来查看某个子命令的具体用法。当然, 你也可能会使用到 man

1
man command

绝大部分的命令行程序都遵守着这种契约。还有很多其他的默认设计规范,上面没有介绍到。 这篇文章的目的就是要列出这些不成文的设计哲学, 以便我们自己在编写命令行程序的时候不走弯路,也能顺畅的使用。

设计规范

  1. 程序返回合适的退出状态号码,执行成功返回0,否则返回对应的错误码,使用者能够参考返回码找到错误原因.

  2. 永远要支持 --version--help, -h

  3. 支持长参数的简写,比如支持--number的同时支持简写-n,--number用于脚本文件中,s-n用于手动执行命令

  4. 使用-选项来处理标准输入和标准输出.

  5. 对于 bool 类型的参数-b=true-b应该等价

  6. 支持多个 bool 类型的参数合并写 -i -t应该可以合并为-it

  7. 日志区分错误日志和提示日志,并且分日志级别,错误日志往标准错误输出中输出,其他日志往标准输出中输出

  8. 有默认参数,并且可以通过命令参数和环境变量来设置对应的值.

  9. 命令行参数优先于环境变量,环境变量优先于默认值.

具体建议

命令行简写 简写说明
-a –append 的简写, 表示增加
-c –color的简写,表示演示,–clean的简写,表示清空
-d –deamon 的简写,表示后台运行, –dir 表示目录
-e –enviroment的简写,表示环境变量
-f –force的简写,表示强制执行,–file的简写,表示者件路径|
-g –global 的简写,表示全局
-h –help 的简写,显示帮助信息, –human 表示人类可理解
-i, -I –input 的简写,表示输入,–ignore 的简写,表示忽略
-k –keep的简写,表示保持
-l –list的简写, 表示列表展示
-m –motify的简写,表示修改
-n –number的简写, 表示数量
-o –output的简写,表示输出
-p –port的简写, 表示端口
-q –qualify的简写,表示独一
-r –recursion的简写,表示递归
-s –set的简写, 表示设置
-t 表示 –terminal 或者 –time
-u,-U –user 表示用户, –update 表示更新
-v, -V –version的简写,显示版本信息或者调试信息
-w –workspace的简写,表示工作空间
-x 显示执行过程
-y –year的简写,表示年份
-z –zone的简写,表示区域