ksh变量接受的最大字符数是否可以增加?

4
这是关于

ksh变量可以接受的最大字符数是多少?

的后续问题。
我检查了我的环境,它只允许
#include <sys/limits.h>
$ cpp <<  HERE | tail -1
> #include <limits.h>
> ARG_MAX
> HERE
1048576

有没有办法增加这个?或者其他替代方案?

 while read line;
   do
      #parse logic
   done < $filename

处理非常长的行?根据我解析的记录,它不会停止在2M个字符行。

环境细节:

 AIX $ KSH Version M-11/16/88f 

你为什么需要这么大的shell变量? - Basile Starynkevitch
这是AIX内核还是Linux内核? - Basile Starynkevitch
你不能用除了 ksh 以外的其他方式解析你的文件吗? - Basile Starynkevitch
1个回答

3
您可以编译Linux 3.7.x内核,并编辑其include/uapi/linux/limits.h文件,以增加ARG_MAX参数(例如增加到更大的2的幂次方,如2097152)。但是,如果您想进一步增加它,最好拥有大量RAM(例如8GBytes)。

实际限制与execve(2)相关。该手册有一段关于此的描述。

但是,您可以通过使用其他工具(如awkpythonperl等)来读取文件,从而避免使用巨大的shell变量(在Unix环境中)。它们的变量环境不是传输给分叉程序的shell环境,因此它们可以拥有具有非常长值的变量。也许ksh有一些内置命令(如unexport),可以避免将某些变量导出到Unix环境中。


嗨,Basile,谢谢你的回复。我没有重新编译内核的自由。一个问题,这是否适用于所有脚本语言?如果我使用perl,在执行读取行时也会遇到这个问题吗? - javapadawan
我正在解析一个大文件,有些行有很多记录。脚本99%的时间都在工作,但对于1%的记录,每行有超过2M个字符。 - javapadawan
1
ARG_MAX doesn't come into play here, because it limits the length of the command line when invoking external utilities, whereas read is a shell builtin (and the data is read from a file, not passed as a command-line argument). The following ksh command demonstrates that it is possible to read lines that are longer than ARG_MAX: IFS= read line < <(printf "%$(( $(getconf ARG_MAX) + 1 ))s"); echo "${#line}" - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接