在bash脚本中,我尝试从标准输入读取行,在设置IFS=$'\n'
后使用内置的read
命令。如果我将输入粘贴到读取中,则这些行将被截断为4095个字符的限制。这一限制似乎来自从终端阅读,因为这工作完全正常:Linux终端输入:从终端截取行读取用户输入,限制在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/86和13.04/86,但Cygwin的(最新版本至少)还没有超过10000个字符(没有进一步测试,因为我需要得到这个截断在Ubuntu中工作的脚本)。使用的终端:虚拟控制台和KDE konsole
(Ubuntu 13.04)和gnome-terminal
(Ubuntu 10.04)。
是的管道有这样的限制,实际上它是相关的注意到,非交互版本使用管道,并且必然会有_几个写入和读取_。但我认为这个限制不应该影响终端输入(终端不是管道)。 – FooF