Linuxで端末に貼り付けるときの行の長さに制限はありますか?

Linuxで端末に貼り付けるときの行の長さに制限はありますか?

kafka-console-producer.sh次からメッセージを送信します。

#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx512M"
fi
exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"

次に、Putty端末を介してメッセージを貼り付けます。受信側では、メッセージが約4096バイトに切り捨てられたことを確認しました。 Kafkaのどこにもこの制限はありません。

この制限はbash / terminalまたはPuttyで発生する可能性がありますか?

ベストアンサー1

4095 は、Linux の tty 行ルールに対する内部エディタの長さの制限です。termios(3)マニュアルページから:

  • 最大行長は4096文字です(終了改行文字を含む)。 4096文字より長い行は切り捨てられます。 4095文字以降は入力処理(ISIGおよびECHO *処理など)が続きますが、4095文字以降のすべての入力データは終了改行文字まで(含まれていない)削除されます。これにより、少なくとも1行を読むことができるまで、端末は常により多くの入力を受け取ることができます。

また見てくださいLinuxカーネルの対応するコード

たとえば、次のように入力すると:

$wc-cEnter

Enterシェル自体のラインエディタ(bashのreadline)からシェルにラインを送信します。コマンドラインが完了したら、シェルはそれを実行する準備ができているので、独自の行エディタを残して端末デバイスを再仕様(別名)。料理)モード、これはおおよそのラインエディタ(実際にはカーネルのttyドライバで実装されています)を有効にします。

その後、5000バイトの行を貼り付けた場合は、Ctrl+を押してDその行をコミットすると、完了したことを知らせるwc出力が再び表示されます4095

(この制限はbash独自の行エディタには適用されません。シェルプロンプトでより多くのデータを貼り付けることができることがわかります。bash

したがって、受信アプリケーションが標準入力から入力ラインを読み込み、標準入力が端末装置であり、アプリケーションが独自のラインエディタを実装せず(たとえば)入力モードを変更しないbash場合、ラインは次のものより長くなります。 4096バイト(終了改行文字を含む)は入力できません。

stty -icanonただし、受信アプリケーションを起動する前にターミナルデバイスの行エディタ(使用)を無効にすると、入力時に入力内容を直接読み取ることができます。ただし、Backspace/ Ctrl+を使用Wして入力を編集したり、Ctrl+を使用Dして入力を終了したりすることはできません。

次のように入力する場合:

$保存済み= $(stty -g); stty -icanon icrnl;トイレ-c;Enter

5000バイトの長さの行を貼り付けてキーを押すと、Enter5001が表示されます。

おすすめ記事