在 bash 脚本中,我尝试在设置后使用内置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 脚本中遇到了相同的行为(不接受来自终端的超过 4095 的输入,但从管道接受):
#!/usr/bin/python
from sys import stdin
line = stdin.readline()
print('%s' % line)
甚至 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:有没有办法在 Linux 系统(至少 Ubuntu 10.04 和 13.04)中从终端交互式读取超过 4095 个字符?
问题2:这个限制来自哪里?
受影响的系统:我在 Ubuntu 10.04/x86 和 13.04/x86 中注意到了这个限制,但是 Cygwin(至少是最近的版本)在超过 10000 个字符时还没有截断(没有进一步测试,因为我需要让这个脚本在 Ubuntu 中工作)。使用的终端:虚拟控制台和 KDE konsole
(Ubuntu 13.04) 和gnome-terminal
(Ubuntu 10.04)。