x-cmd 理念 -- 尽力而为的一致性
命令行给人复杂的感觉来源于40年来多种命名、交互方式的累积和冲突。试想一下,操作系统中每个软件的关闭方式都不一样。x-cmd 试图缓解这个问题,为用户提供一个平缓的迁移和探索曲线。
x-cmd 引入并大量使用的概念和行为
- use/try 术语
在 x-cmd 模块中,有意识地复用
use和try这两个术语:use:设置全局生效try:只在当前 shell 会话中生效
示例:
bash# 在所有 x-cmd shell 会话中直接使用 jq x env use jq # 仅在当前会话使用 jq,不影响其它会话 x env try jq - 应用场景
除了 env/pkg 模块,以下模块也使用这些概念:
- 为何不用 install/setup?
刻意避开
install、setup甚至global这类术语。这些术语已被广泛使用,但不同命令对此有不同解释,导致大量偏差。x-cmd 在技术文档中尽量(尽管很难)避免使用"安装"概念,而是将其展开为实际行为(如下载、应用、在 PATH 中加载二进制路径),以清晰阐明区别——即与传统行为相比,x-cmd 如何小心地避免或减少软件对环境和系统带来的影响。
-h和--help关于
-h和--help这两个参数的行为,直到最近两年才完全确定:- 它们是子命令,尽管看似像参数(以
-开头) - 返回 0,而不是 1、64 等其他编码
- 在 TTY 下返回时有高亮着色;其余情况输出纯文本
- 日后会按需提供 JSON 和 YAML 格式
该子命令统一返回标准帮助文档,通常附带 tldr 示例及参数说明。每项参数说明通常只占一行;若出现第二行,则为补充信息,第二行及以后内容设置为灰色。
- 它们是子命令,尽管看似像参数(以
参数错误
- 参数格式有误时返回 64
- 有些参数之所以有误,是基于当前状态而定,通常归类为 1 或其他返回值;但在某些情况下,假设用户在已知当前状态下仍提供了不合法参数,此时会返回 64
模块配置 --cfg 子命令
最近统一了一项行为:在可配置的模块中,统一通过 --cfg 子命令来打开配置应用。
此前还提供了 --init 和 init 这两个子命令,但发现 init 这个术语过于普及,可能会与某些原生命令的子命令冲突。
cfg 是精选的术语,通常是 config 的缩写(一般缩写为 conf),再加上 -- 前缀,降低了可能的冲突。
TTY 和非 TTY 下的行为
- 在 TTY 环境下,尽量打开图形化应用,或提供着色输出
fz 子命令
非常热衷于采用 fzf 来为模块编写信息密集型应用。不过,x-cmd 首先要兼顾特别严苛的环境(即不能使用 fzf 的环境)。
因此,仍会在相应模块中保留并继续开发采用 awk 编写的 TUI,甚至将其设置为默认应用。用户如果想打开 fzf 编写的应用,可统一采用 fz 子命令:
x ccal fz # x ccalls 子命令
遵循 ls 即 list 缩写的原则,在大部分模块中都提供了 ls 这类查询信息的子命令。
一般而言,ls 处理的数据都会以表格形式提供;会打开表格 TUI 应用,并让用户方便地查看和操作。
对于非 TTY 的场景,ls 的输出将是 TSV,这是一种非常便于 awk 处理的数据结构。另外,一般还会提供 --json 或者 --yml 格式。
帮助我们改善文档
X-CMD 的文档内容来自命令的帮助文档、多个数据源以及文档库生成。文档中如果有错误或不明确的地方,欢迎通过这些方式进行告知~
完成验证加入微信群