В bash script я пытаюсь читать строки со стандартного ввода, используя встроенную команду read
после установки IFS=$'\n'
. Строки усекаются с пределом 4095 символов, если я вставляю ввод в чтение. Это ограничение, похоже, исходит от чтения с терминала, потому что это отлично работает:
fill=
for i in $(seq 1 94); do fill="${fill}x"; done
for i in $(seq 1 100); do printf "%04d00$fill" $i; done | (read line; echo $line)
Я испытываю такое же поведение с Python script (не принимал дольше 4095 ввода от терминала, но принимал его из канала):
#!/usr/bin/python
from sys import stdin
line = stdin.readline()
print('%s' % line)
Программа Even C работает одинаково, используя read(2)
:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
char buf[32768];
int sz = read(0, buf, sizeof(buf) - 1);
buf[sz] = '\0';
printf("READ LINE: [%s]\n", buf);
return 0;
}
Во всех случаях я не могу ввести более 4095 символов. Запрос на ввод прекращает принимать символы.
Вопрос-1: Есть ли способ интерактивного чтения с терминала длиной более 4095 символов в системах Linux (по крайней мере, Ubuntu 10.04 и 13.04)?
Вопрос-2: Откуда взялось это ограничение?
Затрагиваемые системы: Я заметил это ограничение в Ubuntu 10.04/x86 и 13.04/x86, но Cygwin (по крайней мере, последняя версия) не обрезает еще более 10000 символов (не тестировалось дальше, так как я нужно, чтобы этот script работал в Ubuntu). Используемые терминалы: Виртуальная консоль и KDE konsole
(Ubuntu 13.04) и gnome-terminal
(Ubuntu 10.04).