当我们在开发 FinSH 时,我们了解到,在编写命令行应用程序之前,你需要熟悉 GNU 命令行标准。这个标准实践的框架有助于给界面带入熟悉感,这有助于开发人员在使用时感到舒适和高效。
一个完整的 GNU 命令主要由四个部分组成。
命令名(可执行文件):命令行程序的名称;
子命令:命令程序的子函数名称。
选项:子命令函数的配置选项。
参数:子命令函数配置选项的相应参数。
你可以在任何命令中看到这一点。以 Git 为例:
gitreset--hard HEAD~1
这一点可以分解为:
可执行的命令是 git,子命令是 reset,使用的选项是 --head,参数是 HEAD~1。
再举个例子:
systemctl enable --now firewalld
可执行的命令是 systemctl,子命令是 enable,选项是 --now,参数是 firewalld。
想象一下,你想用 RT-Thread 编写一个符合 GNU 标准的命令行程序。FinSH 拥有你所需要的一切,并且会按照预期运行你的代码。更棒的是,你可以依靠这种合规性,让你可以自信地移植你最喜欢的 Linux 程序。
编写一个优雅的命令行程序
下面是一个 RT-Thread 运行命令的例子,RT-Thread 开发人员每天都在使用这个命令:
usage:env.py package[-h][--force-update][--update][--list][--wizard]
[--upgrade][--printenv]
optional arguments:
-h,--help show this help message andexit
--force-update force update and clean packages, install or remove the
packages by your settings in menuconfig
--update update packages, install or remove the packages by your
settings in menuconfig
--list list target packages
--wizard create a newpackagewith wizard
--upgrade upgrade local packages listand ENV scripts fromgit repo
--printenv print environmental variables to check
正如你所看到的那样,它看起来很熟悉,行为就像你可能已经在 Linux 或 BSD 上运行的大多数 POSIX 应用程序一样。当使用不正确或不充分的语法时,它会提供帮助,它支持长选项和短选项。这种通用的用户界面对于任何使用过 Unix 终端的人来说都是熟悉的。
选项种类
选项的种类很多,按长短可分为两大类。
短选项:由一个连字符加一个字母组成,如 pkgs -h 中的 -h 选项。
长选项:由两个连字符加上单词或字母组成,例如,scons- --target-mdk5 中的 --target 选项。
你可以把这些选项分为三类,由它们是否有参数来决定。
没有参数:该选项后面不能有参数。
参数必选:选项后面必须有参数。
参数可选:选项后可以有参数,但不是必需的。
正如你对大多数 Linux 命令的期望,FinSH 的选项解析非常灵活。它可以根据空格或等号作为定界符来区分一个选项和一个参数,或者仅仅通过提取选项本身并假设后面的内容是参数(换句话说,完全没有定界符)。