"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 u
和 x
之一)和可选的函数修饰符组成的键.都是单字母,不能有内嵌的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 语法(带连字符)。
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 u
和 x
之一)和可选的函数修饰符组成的键.都是单字母,不能有内嵌的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 语法(带连字符)。