In uno script bash, provo a leggere le righe da input standard, utilizzando il comando integrato read
dopo aver impostato IFS=$'\n'
. Le righe vengono troncate al limite di 4095 caratteri se si incolla l'input nella lettura. Questa limitazione sembra provenire dalla lettura dal terminale, perché questo ha funzionato perfettamente bene:Terminale Linux input: lettura input utente da linee di troncamento terminali con limite di caratteri 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)
provo lo stesso comportamento con script Python (non accettava più di 4095 di ingresso dal terminale, ma accettato dal tubo):
#!/usr/bin/python
from sys import stdin
line = stdin.readline()
print('%s' % line)
programma Anche C funziona allo stesso, utilizzando 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;
}
In tutti i casi, non posso entrare più lungo di circa 4095 caratteri. Il prompt di input smette di accettare caratteri.
Question-1: C'è un modo per leggere interattivamente dal terminale più di 4095 caratteri nei sistemi Linux (almeno Ubuntu 10.04 e 13.04)?
Question-2: Da dove viene questa limitazione?
Sistemi interessati: ho notato questa limitazione in Ubuntu 10.04/86 e 13.04/86, ma Cygwin (versione recente almeno) non troncare ancora a più di 10000 caratteri (non prova più da quando ho bisogno di ottenere questo script funzionante in Ubuntu). Terminali utilizzati: Virtual Console e KDE konsole
(Ubuntu 13.04) e gnome-terminal
(Ubuntu 10.04).
Sì, esiste una tale limitazione per pipe e in realtà è rilevante notare che il valore non interattivo la versione usa le pipe e per necessità ci saranno _siverse scritture e letture_. Ma penso che questo limite non dovrebbe influenzare l'ingresso del terminale (i terminali non sono tubi). – FooF