"tar" 是否遵循 POSIX and/or GNU 命令行选项约定?

Does "tar" follow either the POSIX and/or GNU command line options conventions?

tar is one of those venerable programs that is literally on every single UNIX-like system out there. There is POSIX-compliant tar and there is GNU tar

A typical way 使用 tar 是类似 tar -czf archive.tar.gz dir 的命令。选项 -c 是创建一个新的存档,-z 是压缩,-f 指定输出文件名。请注意 -c-z 没有参数但 -f 有参数。

This page 描述了 POSIX 和 GNU 命令行约定。请注意以下几点:

Multiple options may follow a hyphen in a cluster if they do not take arguments. Thus, -abc and -a -b -c are the same.

这是否意味着 tar 的命令行参数处理既不符合 POSIX 也不符合 GNU 约定?还是我看错了什么?

你没有误会,Unix tar 既不遵循 POSIX 也不遵循 GNU 标准。

当它出现在 Unix 版本 7 中时,tar 第一个参数被定义为由一个函数字母(c r t ux 之一)和可选的函数修饰符组成的键.都是单字母,不能有内嵌的space。一些函数修饰符需要一个参数,该参数必须按照修饰符的顺序出现在以下参数中。

后来,tar 实现确实允许连字符作为整个键的前缀,或一个连字符作为单个功能字母的前缀,但保留了在功能字母末尾分隔参数的约定对于最后一个选项(通常是 f),允许它有自己的参数。

此外,GNU tar 支持三种选项样式,旧的带有初始键后跟键参数,单字母选项语法类似于 POSIX 传递参数的标准方式,以及长选项样式,其中单词选项由两个破折号引入。

GNU tar 允许将这些语法(超出许多其他语法)用于同一命令:

tar czvbf 20 archive.tar.gz dir
tar -czvf archive.tar.gz  -b 20 dir
tar -c -z -v -b 20 -f archive.tar.gz dir
tar --create --gzip --verbose --blocking-factor=20 --file=archive.tar.gz dir
tar --create --gzip --verbose --blocking-factor=20 --file archive.tar.gz dir

使用 GNU tar 可以组合不同的样式,但由于解析规则的变化可能会产生意想不到的结果。

从原始语法完全转换为 POSIX 选项标准语法可能会严重破坏与使用 tar 的现有脚本的兼容性。这可能是 tar 命令根本没有被 POSIX 和 pax 标准化的原因之一,它们支持 POSIX 标准化的 tar 文件格式,已创建。

请注意,ps 也存在类似的问题,它有两种不兼容的语法,BSD 语法(无连字符)和 Unix 语法(带连字符)。