Linux

在 Linux 中粘貼到終端時,行長是否有限制?

  • April 9, 2021

我正在嘗試從 發送消息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 嗎?

4095 是 Linux 上 tty 行規程內部編輯器長度的限制。從termios(3)手冊頁:

  • 最大行長為 4096 個字元(包括終止換行符);超過 4096 個字元的行將被截斷。在 4095 個字元之後,輸入處理(例如,ISIG 和 ECHO* 處理)繼續,但在 4095 個字元之後直到(但不包括)任何終止換行符的任何輸入數據都將被丟棄。這確保了終端始終可以接收更多輸入,直到可以讀取至少一行。

另請參見Linux 核心中的相應程式碼

例如,如果您輸入:

$ wc -cEnter

Enter在 shell 自己的行編輯器中(在 bash 的情況下為 readline)將行送出給 shell。命令行完成後,shell 已準備好執行它,因此它離開了自己的行編輯器,將終端設備重新置於規範(又名)模式,從而啟用粗略的行編輯器(實際上在 tty 驅動程序中實現核心)。

然後,如果您粘貼一個 5000 字節的行,請按Ctrl+D送出該行,並再次告訴wc您已完成,您將看到4095輸出。

(請注意,該限制不適用於自己的行編輯器,您會看到您可以在shellbash提示符下粘貼更多數據)。bash

因此,如果您的接收應用程序從其標準輸入讀取輸入行,並且其標準輸入是終端設備,並且該應用程序沒有實現自己的行編輯器(就像這樣bash做)並且沒有更改輸入模式,您將無法輸入長度超過 4096 字節的行(包括終止換行符)。

但是,您可以在啟動接收應用程序之前禁用終端設備的行編輯器(使用stty -icanon),以便它在您輸入時直接讀取輸入。但是,您將無法使用Backspace/ Ctrl+W來編輯輸入,也無法使用Ctrl+D來結束輸入。

如果您輸入:

$已保存=$(stty -g); stty -icanon icrnl;頭-n1 | 廁所-c; stty "$ 已保存"Enter

粘貼 5000 字節長的行並按Enter,您將看到 5001。

引用自:https://unix.stackexchange.com/questions/643777