这开始是一个模糊的问题,RPM脚本偶尔会在awk上失败。我将其缩小到以下内容:scriptlet使用GNU扩展:length(array)构造,在posix模式下运行时不支持。好到目前为止。我不明白的是如何在sudo下运行awk会改变posix合规行为。这是一个应该在GNU模式下运行的简单awk脚本,并且应该在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行为的基本机制是什么?
答案 0 :(得分:1)
Awk(真的在linux下gawk)由POSIXLY_CORRECT
环境变量控制,该变量偶尔会从原始用户的环境继承。有问题的安装必须由root运行,但有时管理员将成为root用“su”来保持环境,从而保持他的POSIXLY_CORRECT
,强制gawk进入posix模式,并且失败了GNU长度(数组) ) 延期。在其他时候,管理员将运行“sudo”或“su - ”成为root用户,从root的干净环境开始并成功运行扩展的gawk功能。