跳转至

CLI

基本概念

CLI 应用就是没有图形界面,只能运行在终端里的应用。大多数人写的第一个程序就是这样的,不过由于太过简陋,可能不配被称作 应用

主要技术

POSIX 规范

如果你经常使用 CLI 应用,就会发现它们的用法常是类似的,这是因为它们大多遵循了 POSIX 规范。POSIX 规范有很多部分,比如以下这些

  • 命令行参数语法。大多 CLI 应用通过 -f 这种方式来设置标志,通过 --arg xxx 这种方式来修改参数。
  • 常规行为和约定。比如加上 --help 后就会返回帮助信息,加上 --version 就会返回版本信息。
  • 标准输入、输出和错误。标准输入默认为键盘,标准输出默认为终端,这样可以方便重定向。同时正常输出和错误输出会分开,后者写到标准错误,以便重定向后仍能看到错误信息。
  • 退出状态。CLI 应用退出时应该返回状态码,通常 0 表示成功,非 0 值表示失败。
  • 环境变量。CLI 应用应该尊重用户的环境变量,比如只在 PATH 里找可执行文件,根据 LANG 选择输出内容的语言。
  • 文件和目录。大多 CLI 应用应该要能够处理路径和转义路径(比如 ...),并可以正确处理 符号链接硬连接 等特殊的文件和目录。

POSIX 完整规范很长,你不必完全遵守,并且也有很多框架能让你轻松制作出符合 POSIX 规范的 CLI 应用。

TUI

TUI 全称为终端用户界面,或者有时也叫文本用户界面,是指一种基于文本而非图形元素的用户界面。

虽然 CLI 只能运行在终端里,但同样可以使用文本和转义字符提供好看、好用的界面。如果不仅支持键盘输入,还能处理鼠标输入就更好了。大多数基于终端的编辑器(比如 vim/neovim/nano)都使用了 TUI 技术。

同样有很多框架能让你轻松地制作出 TUI。

框架

  • bubbletea Go 的 TUI 框架
  • cobra Go 的 CLI 框架
  • clap Rust 的 CLI 框架
  • click Python 的 CLI 框架
  • typer Python 的 CLI 框架

  • rich Python 富文本库,能够让终端的输出更炫酷
  • tqdm Python 用于在终端显示进度条的库
  • tree-sitter 增量解析库,可以将源代码解析为 具体语法树(CST),适合用来制作代码分析工具。tree-sitter 同时也是解析器生成器,可以用来创建新语言的解析器。

工具

  • flex C 的词法解析器生成器,通常要和 bison 一起使用
  • bison C 的语法解析器生成器,通常要和 flex 一起使用
  • pest Rust 的解析器生成器,根据 PEG 表达式文法生成通用解析器
  • lalrpop Rust 的解析器生成器,能够解析 LR(1) 语法