“--”(双破折号)参数记录在哪里?

“--”(双破折号)参数记录在哪里?

有一些实用程序接受--(双破折号)作为“选项结束”的信号,当文件名以破折号开头时需要:

$ echo "Hello World!" >-file

$ cat -- -file
Hello World!

$ cat -file                      # cat - -file fails in the same way.
cat: invalid option -- 'f'
Try 'cat --help' for more information.

但其中一些实用程序在手册页中没有显示这样的选项。

man页面为cat不记录--任何操作系统中参数的使用(或有效性)。这并不意味着一场 Unix - Linux 的激烈战争,这是一个有效的,而且我相信是有用的担忧。

catmved(我相信还有许多其他人)都没有在我能找到的手册页中记录这样的选项。

请注意,这./-file是使用 的更便携的解决方法--。例如,source(dot) 命令(写为.)(通常)不能很好地处理参数--

$ echo 'echo "Hello World!"' >-file

$ . ./-file
Hello World!

$ . -file
ksh: .: -f: unknown option
ksh: .: -i: unknown option
ksh: .: -l: unknown option
ksh: .: -e: unknown option
Usage: . [ options ] name [arg ...]

$ . -- -file         # works in bash. Not in dash, ksh, zsh.
ksh: .: -file: cannot open [No such file or directory]

答案1

这是所有实用程序的 POSIX 要求,请参阅POSIX 第 12.02 章,指南 10 了解更多信息:

首先--不是选项参数的参数应该被接受作为指示选项结束的分隔符。任何后续参数都应被视为操作数,即使它们以'-'字符开头。

POSIX 建议所有实用程序遵循这些准则。

有一些例外喜欢echo(阅读选项)。和不遵循准则的特殊内置函数(如breakdotexec等):

一些特殊的内置函数被描述为符合 XBD 实用程序语法指南。对于那些不是的,实用程序描述默认值中将“--”识别为要丢弃的第一个参数的要求不适用,并且符合要求的应用程序不得使用该参数。

目的是记录所有不遵循 POSIX 手册页中指南的命令,来自POSIX 第 12.02 章第三段:

一些标准实用程序不符合所有这些准则;在这些情况下,选项部分描述了偏差。

作为POSIXcat手册页记录 OPTIONS 部分中没有偏差,预计它会被接受--为有效参数。

仍然可能存在未能遵循指南的(错误的)实现。

特别是,大多数GNU 核心实用程序遵循此指南

答案2

对于具有 GNU 用户区的 Linux 操作系统:Debian、RedHat、Ubuntu、Mint 等(不是某些 BSD),GNU 通用实践非常重要:

您问题中的实用程序列表的共同点是它们都是 GNU,事实上它们都是 GNU coreutils。这完整的 GNU coreutils 列表更长。

GNU 的大多数实用程序共享一个通用的用户界面和一组通用的基本命令行选项,例如--help--version以及使用 的--信号选项结束

条目位于info commonGNU 网页包含:

所有这些程序中都提供某些选项。此处对每个程序进行描述,而不是为每个程序编写相同的描述。 (事实上​​,每个 GNU 程序都接受(或应该接受)这些选项。)

'--'
分隔选项列表。后面的参数(如果有)将被视为操作数,即使它们以“-”开头。例如,“sort -- -r”从名为 -r 的文件中读取。

访问该条--目的更精确(但不容易解释和记住)的命令是(请准确复制)info -- cat --

答案3

它还记录在getopt(1)getopt(3)

例如,

“--”参数后面的每个参数始终被解释为非选项参数。

答案4

--表示选项结束并禁用进一步的选项处理,它是您使用的 shell 的一部分。

同样的 likeman cat并没有描述空格是命令选项之间的分隔符,因为它在 shell 手册中进行了描述。

你用什么外壳,/bin/bash?所以你问题的答案是man bash,因为它被解释为 shell 功能的一部分,所以它不是命令功能的一部分。


更新:这是不正确的

谢谢你纠正我。我提到的内容对于大多数内置 shell 命令都是正确的(除非手册中另有提及)。但对于外部命令,则涉及 POSIX 约定。

相关内容