2013-01-17 2 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 

Есть ли способ увеличить это? Или любые альтернативы для

Для обработки действительно длинных линий? Основываясь на записях, которые я разбираю, он не останавливается на строках символов 2M.

Окружающая среда Детали:

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

Почему именно вам нужны такие большие переменные оболочки? –

+0

И это ядро ​​AIX или Linux? –

+0

Разве вы не можете разобрать свой файл в чем-то еще, чем 'ksh'? –

ответ

2

Вы могли бы составить 3.7.x ядро ​​Linux, а также редактировать свой файл include/uapi/linux/limits.h увеличить ARG_MAX аргумент (в некоторой большей степени двойки, например, 2097152). Но вы должны иметь большую ОЗУ (например, 8 ГБ), если хотите увеличить ее.

Фактический предел связан с execve(2). На этой странице есть параграф.

Но вы, вероятно, могли бы избежать огромных переменных оболочки (в среде Unix). Считаете ли вы использование какого-либо другого инструмента (awk, python, perl ....), чтобы прочитать ваш файл? Их переменная среда не является средой оболочки, передаваемой в разветвленные программы, поэтому они могут иметь переменные с очень длинными значениями. Возможно, ksh имеет встроенный (unexport), чтобы избежать экспорта некоторой переменной в среду Unix.

+0

Привет, Базиле, спасибо за ваш ответ. У меня нет свободы перекомпилировать ядро. Один вопрос, применим ли это ко всем скриптовым языкам? Если я буду использовать perl, я также столкнусь с этим при чтении строки? – javapadawan

+0

Я разбираю большой файл, а некоторые строки имеют много записей. Скрипт работает 99% времени, но для 1% записей он имеет 2M + символов в строке. – javapadawan

+1

'ARG_MAX' здесь не играет, поскольку он ограничивает длину командной строки при вызове _external utilities_, тогда как' read' является оболочкой _builtin_ (и данные считываются из файла, а не передаются как команда- line аргумент). Следующая команда 'ksh' демонстрирует, что можно читать строки длиннее, чем' ARG_MAX': 'IFS = read line <<(printf"% $ (($ (getconf ARG_MAX) + 1)) s "); echo "$ {# строка}" ' – mklement0

Смежные вопросы