为什么 POSIX 命令中的参数find
为多字符参数名称添加单个连字符,而大多数其他程序使用单个连字符来指示多个单字符标志,并使用双连字符来指示具有多个字符的单个参数名称?
这似乎不一致,我很好奇
A. 为什么它确实不矛盾,或者
B. 该决定的历史。
答案1
请注意,POSIX find 确实支持像其他命令一样的选项,并--
像其他命令一样标记它们的结尾。这些是-H
和-L
。
这-print
,-type
... 不是选项,它们有时被谓词。它们是参数,其顺序很重要,出现在文件路径之后,文件路径本身出现在选项之后。你还拥有(
和!
。他们共同构建了一个表达用于确定要查找哪些文件。
find
并不是唯一的一个。[
(又名test
)和expr
是其他命令,其参数用于构建表达。
例如find
, [
具有以 和 开头-
且超过一个字母的运算符 ( -gt
, -eq
...)。
喜欢find
,test
有那些问题运营商可能会混淆操作数。
find -- "$file1" "$file2" -type f
[ -f "$file1" -a -f "$file2" ]
如果$file2
是的话!
,那就是有问题了find
。如果是=
,那就是 (some) 的问题[
。
对于所有find
、test
和expr
,使用选项来构建表达式实际上并不起作用。另一种选择可能是将一个字符串计算为类似awk
or 的表达式sed
。像
find f1 f2 \( -type f -mtime -1 -o ! -type f -newer x \) -exec ls -ld {} +
做:
find 'found = 0
if (typeof($f) == "f") {
if (age($f) > 1) found=1
} else if (age($f) < age("x")) found = 1
if ($found) exec_multi("ls -ld {}")' f1 f2
但这意味着在find
.这也意味着"x"
上面的 and 命令行可能会出现引用噩梦。
事实上 AT&T Research 确实提出了这样一个命令:TW(tree walker),但即使它现在是开源的,我不知道它是否真的在 AT&T 之外使用。
答案2
find
早于用于--
多字母选项的 GNU 约定。 GNU 引入此约定是为了打破具有单字母选项的程序(这-bar
意味着三个选项-b -a -r
)和具有多字母选项的程序(这-bar
意味着该名称的单个选项)之间现有的不一致。当 GNU 出现时,它可能会影响未来的程序,但不会改变现有的程序,例如find
X11 实用程序等。
find
用作-
谓词和操作的前缀,因为它们有点像选项:它们是关键字,是对特定命令有意义的有限集的一部分。尽管它们不像选项那样被解析,但它们在字典顺序上类似于选项。
答案3
我认为没有有意识的决定让 find 与众不同。除了我没有任何参考资料这电子邮件交换,但据我回忆(自十八世纪中期以来一直使用 find):
您必须意识到,指定选项和参数(作为程序的命令行参数)一开始并没有标准。不同的程序实现了不同的做事方式。在某些时候,选项的单破折号和参数的非破折号被重用/从常用命令中复制,并且 的版本getopt
变得可用,无论是 shell 还是 C 版本。(我记得必须编译我自己的版本因为我工作的 *nix 库中没有它)。
当然,单破折号、单字符选项符合 tty 限制(同样会导致命令缩短(cp
vs. copy
),但不是不言自明的。 find 的开发人员可能选择延长单字符选项以更加清晰和在长选项的双破折号--
流行之前(IIRC 中期),他们就这样做了。
原始手册页底部有以下内容:
BUGS
The syntax is painful.