我正在为 GNU/Linux 上的命令行工具寻找某种“语法键”,类似于 Microsoft 的文档:
例如,Microsoft 命令行语法文档中使用方括号内的文本来表示可选项目。方括号中的文本是一组必填项目,您必须选择一个。等等。
GNU/Linux 中用于指示命令行语法的符号有哪些?每个符号的含义是什么?
答案1
以下是 的摘录man 7 man-pages
,它描述了手册页中各部分的常规含义:
SYNOPSIS A brief summary of the command or function's interface.
For commands, this shows the syntax of the command and
its arguments (including options); boldface is used for
as-is text and italics are used to indicate replaceable
arguments. Brackets ([]) surround optional arguments,
vertical bars (|) separate choices, and ellipses (...)
can be repeated.
我要补充的是,“粗体”和“斜体”实际上如何出现在您的终端上是一个不同的问题。在我的终端上,粗体表示原样文本,下划线文本表示可替换参数;在某些终端上,您可能根本无法获得任何此类格式。
基调是:
- 可选项目包含在方括号中
- 竖线单独选择
- 省略号表示项目或元素可以重复
总的来说,这些约定实际上与您引用的 Microsoft 文档非常相似。
以下是来自手册页的示例概要git diff
:
SYNOPSIS
git diff [options] [<commit>] [--] [<path>...]
git diff [options] --cached [<commit>] [--] [<path>...]
git diff [options] <commit> <commit> [--] [<path>...]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>
可能的选项如此之多,以至于手册页作者决定不在概要中列出所有选项,而只是说[options]
。
概要中的多行是因为有多种可能的(互斥的)方法来使用这个特定的命令。
方括号中的所有内容都是可选的,尖括号中的所有内容都是占位符。
(注意:提交和 blob 是可以存储在 Git 中的对象类型;blob 代表文件的内容,提交代表 Git 跟踪的整组文件的状态。与你的问题无关,但我提到这是为了避免术语上的谜团。)
另一个例子,命令的概要grep
,说明了另一个约定:全部大写的单词有时用于显示占位符(如上面 git 手册页中的尖括号)。
SYNOPSIS
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] -e PATTERN ... [FILE...]
grep [OPTIONS] -f FILE ... [FILE...]
同样,这里有三种不同的方法来调用该grep
命令。通过阅读以上内容,您可以看出:
grep apple orange pear
...意味着这apple
是模式,orange
和pear
都是文件名。
同样,您可以在以下内容中看到这一点:
grep -e apple -e orange pear grapefruit
...apple
和orange
都是模式, 和pear
都是grapefruit
文件。
至于那是什么方法就命令的含义而言做当给定模式和文件时,您必须阅读更多的手册页而不仅仅是概要。但是概要可以让您确定您所赋予的命令如何解释各种参数。
不过,概要符号没有绝对的规则。以下是概要sed
:
SYNOPSIS
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
为了完全理解这一点,您需要进一步阅读手册页,您将在其中找到:
If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret. All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.
答案2
man man
显示手册的手册页,下面是解释所使用约定的摘录,
The following conventions apply to the SYNOPSIS section and can be used as a guide in other sections. bold text type exactly as shown. italic text replace with appropriate argument. [-abc] any or all arguments within [ ] are optional. -a|-b options delimited by | cannot be used together. argument ... argument is repeatable. [expression] ... entire expression within [ ] is repeatable. Exact rendering may vary depending on the output device. For instance, man will usually not be able to render italics when running in a termi‐ nal, and will typically use underlined or coloured text instead. The command or function illustration is a pattern that should match all possible invocations. In some cases it is advisable to illustrate sev‐ eral exclusive invocations as is shown in the SYNOPSIS section of this manual page.
答案3
我不确定你到底要什么。我举三个例子来证明你是对的:
Pipelines
A pipeline is a sequence of one or more commands separated by
one of thwe control operators | or |&. The format for a pipeline is:
[time [-p]] [ ! ] command [ [|||&] command2 ... ]
(来自 Bash 手册;输入man bash
您的 shell)
在bash.pdf来自 GNU,包含一些细微的变化:
The format for a pipeline is
[time [-p]] [!]command1[ | or |&command2] ...
并且在POSIX规范:
The format for a pipeline is:
[!] command1 [ | command2 ...]
仅 shell 就使用了如此多的特殊字符,以至于一致的元语法并不实用。但他们都使用相同的常见嫌疑人。
“shell”不是“命令行”,GNU/Linux 也不是 MS,所以差异加起来。您可能首先需要一些基本信息使用linux shell 和一般的unix - 当然网上有适合您情况的信息。 GNU/Linux 不负责解释基础知识或与 Windows 的差异。
另一个例子,使用find
命令/实用程序
man find
在 GNU/Linux shell bash 中给出:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [ex-
pression]
当您输入/EXPR
男士寻呼机(或只是继续阅读并滚动)时,您会到达
EXPRESSION
The part of the command line after the list of starting points is the
expression. This is a kind of query specification ...[cut]
这将带您去:
OPERATORS
Listed in order of decreasing precedence:
( expr )
Force precedence. Since parentheses are special to the shell,
you will normally need to quote them. Many of the examples in
this manual page use backslashes for this purpose: `\(...\)' in-
stead of `(...)'.
所有这些都可能导致一个精心设计的小“查询”,例如:
find -L /students/projects/myname \
-type d '(' -name '.aaa' -o -name '*rc*' ')' -prune -o \
-path '*/*/class_project/*/*/pikachu/*/*/bambi/bambi.txt' -print
这将搜索所有“bambi.txt”肯定子文件夹,跳过其他某些子文件夹......它需要()
表达:“修剪(跳过),如果它是一个文件夹并且名称是.aaa或包含rc”。
然后需要通过使用单引号或反斜杠来保护括号不被 shell 解释。大多数时候-o
forOR
和默认的-a
forAND
就足够了,因此 GNU/Linux 可以使用它。