2013-01-17 50 views
2

這是一個後續問題是否可以增加ksh變量接受的最大字符數?

What is the maximum number of characters that the ksh variable accepts?

我檢查了我的環境,它僅允許

#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 
+0

爲什麼你想要這麼大的shell變量? –

+0

它是AIX內核還是Linux內核? –

+0

你不能用'ksh'來解析文件嗎? –

回答

2

你可以編譯一個Linux 3.7.x內核,並編輯其include/uapi/linux/limits.h文件,以增加ARG_MAX參數(與兩個大些的功率,例如2097152)。但是如果你想增加更多的內存,你應該有更多的RAM(例如8GBytes)。

實際限制與execve(2)有關。該手冊頁上有一個段落。

但是你可以避免擁有巨大的shell變量(在U​​nix環境中)。您是否考慮使用其他工具(awkpython,perl ....)來讀取您的文件?它們的變量環境並不是將shell環境傳輸給分支程序,因此它們可以具有非常長的值。也許ksh有一些內置的(unexport),以避免將某些變量導出到Unix環境中。

+0

嗨巴西爾,謝謝你的迴應。我沒有重新編譯內核的自由。一個問題,這是否適用於所有腳本語言?如果我使用perl,我會在讀取一行時遇到這個問題嗎? – javapadawan

+0

我正在解析一個大文件,有些行有這麼多的記錄。該腳本在99%的時間內工作,但對於1%的記錄,每行有2M +個字符。 – javapadawan

+1

'ARG_MAX'在這裏不起作用,因爲它在調用_external utilities_時限制命令行的長度,而'read'是一個shell _builtin_(並且數據從文件讀取,不作爲命令傳遞)在線參數)。下面的'ksh'命令表明可以讀取長度大於'ARG_MAX'的行:'IFS =讀取行<(printf「%$(($(getconf ARG_MAX)+ 1))s」);回聲「$ {#line}」' – mklement0

相關問題