Wejście terminalu Linux: odczyt danych wejściowych użytkownika z linii obcięcia terminala przy limicie 4095 znaków
W skrypcie bash próbuję czytać linie ze standardowego wejścia, używając wbudowanegoread
polecenie po ustawieniuIFS=$'\n'
. Linie są obcinane przy limicie 4095 znaków, jeśli wkleję dane wejściowe do odczytu. To ograniczenie wydaje się wynikać z odczytu z terminala, ponieważ działało to doskonale:
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)
Doświadczam tego samego zachowania ze skryptem Pythona (nie akceptowałem danych dłuższych niż 4095 z terminala, ale akceptowanych z potoku):
#!/usr/bin/python
from sys import stdin
line = stdin.readline()
print('%s' % line)
Nawet program C działa tak samo, używającread(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;
}
We wszystkich przypadkach nie mogę wprowadzić więcej niż około 4095 znaków. Polecenie wprowadzania przestaje akceptować znaki.
Pytanie 1: Czy istnieje sposób na interaktywne czytanie z terminala dłuższego niż 4095 znaków w systemach Linux (przynajmniej Ubuntu 10.04 i 13.04)?
Pytanie 2: Skąd pochodzi to ograniczenie?
Dotyczy systemów: Zauważyłem to ograniczenie w Ubuntu 10.04 / x86 i 13.04 / x86, ale Cygwin (przynajmniej najnowsza wersja) nie obcina jeszcze ponad 10000 znaków (nie testowałem dalej, ponieważ muszę uzyskać ten skrypt działający w Ubuntu). Użyte terminale: Virtual Console i KDEkonsole
(Ubuntu 13.04) ignome-terminal
(Ubuntu 10.04).