一、使用模式
一条描述命令用法的语句叫一条使用模式
一条使用模式以“Usage:”或者“用法:”开头,如下例:
Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]
用法:git [--version] [--help] [-C <路径>] [-c <名称>=<取值>]
[--exec-path[=<路径>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<路径>] [--work-tree=<路径>] [--namespace=<名称>]
[--super-prefix=<路径>] [--config-env=<名称>=<环境变量>]
<命令> [<参数>]
二、元素
使用模式由元素组成
元素,英文是element
一个元素就是一个单词。
三、元素种类
(一)program 应用程序名
第一个单词是应用程序名,也可以叫命令或者全局命令
如上例中的find和git
(二)option 选项
可以分为短选项和长选项
1.short option 短选项
以-开头的单词被称为短选项
如上例中的-H
(1)短选项可以合并
-abc与 -a -b -c相同
(2)短选项可以带参数
短选项后面可以加参数,选项与参数中间可以有零个或多个空格
如,-f FILE与-fFILE相同
2.long option 长选项
以--开头的单词称为长选项
如上例中的--version
(1)长选项可以带参数
长选项后面可以带参数,选项与参数中间可以是一个或多个空格,或者是=
如,--input=ARG与--input ARG相同
因为命令有两种:program和command,也就是全局命令和子命令。所以选项也就分为全局选项和子命令选项。
全局选项对应全局命令,子命令选项对应子命令。
(三)argument 参数
1.选项参数
2.命令参数
一个参数可能有歧义
--input ARG
这个ARG是input选项的参数,还是命令的参数?
-fFile
到底是短选项的合并,还是f选项的参数?
(四)command 子命令
不是选项和参数的元素都是子命令
为什么要叫子命令,为了与program命令区分。
如,git commit -m 'message'中的commit就是子命令
总结一下,一条使用模式大概长这样:
usage: 命令 全局选项 子命令 子命令选项 参数
四、特殊符号
因为一些历史原因,不同的命令可能使用不同的规范,我们这里介绍一种相对常见的规范。这种规范就是git命令采用的规范。
(一)元素如果没有包在<>内
要原样输入
如上例中的--help
(二)<>
必须将其替换成值。就如变量一般,需要根据情况替换成适当的值;
如上例中的<路径>
注意:有的会用斜体字或者用下划线或者用全大写,而不是<>。不过是一个意思。
(三)可选元素 []
在[]中的元素,说明在输入命令时可以带,也可以不带这个元素
如上例中的[--info-path]
多个元素是包在同一个[],还是分别包在不同[]内,是相同的
Usage: my_program [command --option <argument>]
与
Usage: my_program [command] [--option] [<argument>]
相同
(四)必须元素 ()
所有没有包在[]内的元素,都是默认必须带的
但是有时需要显式说明必须元素,包在()中的元素,说明在输入时必须带
比如一种情况是:当您需要对互斥元素进行分组时
my_program (--either-this <and-that> | <or-this>)
另一种情况是:当您需要指定如果有一个元素存在,那么就需要另一个元素
Usage: my_program [(<one-argument> <another-argument>)]
这种情况下,要么没有参数,要么有两个参数
注意:有时会用{},而不是()。不过是一个意思。
(五)互斥元素 |
使用|分隔的元素,是互斥的,也就是说只能从中选1个
如上例中的-p | --paginate | -P | --no-pager
如果必须带一个互斥元素,就应该用()包住
Usage: my_program go (--up | --down | --left | --right)
如果这个互斥元素是可选的,就用[]包住
Usage: my_program go [--up | --down | --left | --right]
不同使用模式与互斥其实是相同的
Usage: my_program run [--fast]
my_program jump [--high]
与
Usage: my_program (run [--fast] | jump [--high])
相同
(六)重复元素 ...
使用...来说明左边的元素重复一次或多次
如果指定零或多次
my_program [<file>...]
my_program [<file>]...
my_program [<file> [<file> ...]]
如果指定一次或多次
my_program <file>...
如果指定两次或多次
my_program <file> <file>...
五、具有特殊含义的字符串
(一)options
代表所有选项,包括短选项和长选项
如果my_program有全部选项如下
--all List everything.
--long Long output.
--human-readable Display in human-readable format.
那么,Usage: my_program [options] <path>
就等于
Usage: my_program [--all --long --human-readable] <path>
(二)--
正常情况下--是引导长选项的;
但是当--单独出现时,它的含义是:分隔选项与参数,目的是防止出现歧义,说明这个参数是命令参数,而不是选项参数
如,my_program -f -- <参数>,说明<参数>是my_program的参数,而不是-f的参数
(三)-
正常情况下-引导短选项;
但是当-单独出现时,它的含义是:程序应当处理stdin标准输入,而不是文件。
如,cat -,表示显示标准输入的内容
六、选项描述
选项描述是使用模式下方的描述选项的文本
必须以-或者--开头
如,--all List everything.
(一)同义的短选项和长选项可以写在一行
使用逗号分隔
如,
-o FILE, --output=FILE
-i <file>, --input <file>
(二)选项有参数
在选项后加参数
如,
-o FILE
--output=FILE
(三)添加描述文本
使用至少两个空格分隔选项与描述文本,防止把描述文本当成参数
如,
--verbose MORE text. 错误写法,这样容易把MORE当成选项参数
-q Quit. 正确写法
-o FILE Output file. 正确写法
--stdout Use stdout. 正确写法
(四)参数的默认值
在描述文本中加入[default: <the-default-value>]可以说明参数的默认值
如,
--coefficient=K The K coefficient [default: 2.95]
--output=FILE Output file [default: test.txt]
--directory=DIR Some directory [default: ./]
七、man命令
命令的手册页第一行,经常看到这样的形式:
command(1)
或者在使用命令man command时,显示如下的形式:
man cd
Man: 寻找所有匹配的手册页 (set MAN_POSIXLY_CORRECT to avoid this)
* cd (1)
cd (n)
cd (3tcl)
Man: 您需要什么手册页?
Man:
这时需要按下括号中的字符串,进入对应的手册页。
那么这个括号里的字符串是什么意思呢,通过 man man 命令就可以知道,这个数字是section,也叫章节。通过它,可以知道这个命令是什么类型的。
大多数类unix操作系统,有如下section:
0 Header files (usually found in /usr/include)
1 可执行程序或 shell 命令
2 系统调用(内核提供的函数)
3 库调用(程序库中的函数)
4 特殊文件(通常位于 /dev)
5 文件格式和规范,如 /etc/passwd
6 游戏
7 杂项(包括宏包和规范), 如 man(7),groff(7), man-pages(7)
8 系统管理命令(通常只针对 root 用户)
9 内核例程 [非标准
n tcl函数
l 数学库函数