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/x86と13.04/x86の中でこの制限に気づいたが、Cygwinの(少なくとも最近のバージョン)が10000以上の文字で、まだ切り捨てられません。私はこれを取得する必要があるため(さらにテストしていませんスクリプトはUbuntuで動作します)。使用端末:仮想コンソールとKDE konsole
(Ubuntu 13.04)とgnome-terminal
(Ubuntu 10.04)。
はいパイプにはこのような制限があります。実際には、非インタラクティブバージョンはパイプを使用し、必然的に_いくつかの書き込みと読み取りが行われます_。しかし、私はこの限界が端末の入力に影響してはならないと考えています(端末はパイプではありません)。 – FooF