【问题标题】:-i without argument: is GNU sed --posix option bugged or BSD sed is not POSIX-compliant?-i 不带参数:是 GNU sed --posix 选项被窃听还是 BSD sed 不符合 POSIX?
【发布时间】:2021-10-04 15:56:49
【问题描述】:

这主要是here提出的一个好奇问题。

从我阅读的 GNU sed 4.8 的手册页

       --posix

              disable all GNU extensions.

所以我知道,如果像下面这样的代码有效,则意味着 POSIX 允许 -i without 参数:

sed --posix -i -n '1,25p' *.txt

另一方面,相同的代码(有或没有--posix)不适用于 MacOS 的 BSD sed,因为该版本要求 -i 后跟一个参数。

我只能看到两种相互排斥的可能性:

  • GNU sed 的 --posix 选项允许的不仅仅是 POSIX,这意味着它存在错误并需要错误报告
  • BSD sed 不符合 POSIX。

真相是什么?

【问题讨论】:

  • pubs.opengroup.org/onlinepubs/9699919799/utilities/… 看起来 -e-f-n 是 POSIX 指定的唯一标志。其他标志的行为取决于实现。 (虽然严格的阅读意味着像 -i 这样的参数应该被视为一个文件名,并且一个符合要求的实现应该保释像 -i: file not found 这样的错误)
  • GNU sed's --posix option allows more than POSIX POSIX 未指定选项--posix,因此如果您希望--posix 在非posix 标志上出错,则执行sed --posix 应该总是出错。这不是bug,--posix 是排除非posix sed 命令,如TW1~2p,而不是标志。

标签: sed posix gnu bsd gnu-sed


【解决方案1】:

--posix指的是sed语言本身,不是命令行界面:

GNU sed 包括几个对 POSIX sed 的扩展。为了简化编写可移植脚本,此选项禁用本手册记录的所有扩展,包括附加命令。

POSIX 没有指定-i,因此没有它的实现仍然可以符合 POSIX。

【讨论】:

  • 解释有道理,但我在哪里可以阅读 POSIX 不强加命令行规则?
  • POSIX 可以,但 GNU sed --posix 只切换脚本语言。它仍然允许其他命令行标志……例如--posix。 POSIX 通常允许实现做额外的事情,不需要“只做”POSIX。
猜你喜欢
  • 1970-01-01
  • 2022-11-26
  • 2021-09-24
  • 2011-01-20
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多