在sudo下Awk失去posix模式

在sudo下Awk失去posix模式,awk,sudo,gawk,Awk,Sudo,Gawk,这始于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);}' $ /b

这始于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行为的底层机制是什么?

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

我不会将数组的
length
称为“过时”,它是POSIX awk的GNU扩展。是否为非root用户设置了
POSIXLY_CORRECT
环境变量?@BenjaminW。谢谢,就是这样……如果你想用POSIX的方式求数组的长度:
c=0;对于(i数组中)C++;打印c