【问题标题】:Awk losing posix mode under sudosudo 下的 awk 丢失 posix 模式
【发布时间】:2018-08-16 02:33:44
【问题描述】:

这开始是一个模糊的问题,RPM scriptlet 偶尔会在 awk 上失败。我将其缩小到以下几点: scriptlet 使用 GNU 扩展:length(array) 构造,在 posix 模式下运行时不受支持。到目前为止还可以。我不明白在 sudo 下运行 awk 如何改变 posix 合规行为。这是一个简单的 awk 脚本,它应该在 GNU 模式下运行,而在 posix 模式下应该会失败。

$ cat ./try
/bin/awk 'BEGIN{x[1]=foo;x[2]=bar;print length(x);}'
$ /bin/awk --version | grep Awk
GNU Awk 4.0.2
$ id
uid=0(root) gid=0(root) groups=0(root)
$ /bin/sh ./try
awk: cmd. line:1: fatal: length: received array argument
$ sudo /bin/sh ./try
2
$ 

改变 awk 行为的底层机制是什么?

【问题讨论】:

  • 我不会在数组“过时”上调用length,它是 POSIX awk 的 GNU 扩展。
  • 你是否为非root用户设置了POSIXLY_CORRECT环境变量?
  • @BenjaminW。谢谢,就是这样。

标签: awk sudo gawk


【解决方案1】:

Awk(在 linux 下真的是 gawk)由 POSIXLY_CORRECT 环境变量控制,它偶尔会从原始用户的环境中继承。有问题的安装必须由 root 运行,但有时管理员会成为 root 并使用 "su" 保持环境,从而保持他的POSIXLY_CORRECT,迫使 gawk 进入 posix 模式,并使 GNU 长度(数组)扩展失败.在其他时候,管理员会运行“sudo”或“su -”来成为 root,从 root 的干净环境开始,并成功运行扩展的 gawk 功能。

【讨论】:

  • ...如果您想以 POSIX 方式查找数组的长度:c=0; for (i in array) c++; print c.
猜你喜欢
  • 2020-12-20
  • 2017-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多