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 嗎?
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
輸出。(請注意,該限制不適用於自己的行編輯器,您會看到您可以在shell
bash
提示符下粘貼更多數據)。bash
因此,如果您的接收應用程序從其標準輸入讀取輸入行,並且其標準輸入是終端設備,並且該應用程序沒有實現自己的行編輯器(就像這樣
bash
做)並且沒有更改輸入模式,您將無法輸入長度超過 4096 字節的行(包括終止換行符)。但是,您可以在啟動接收應用程序之前禁用終端設備的行編輯器(使用
stty -icanon
),以便它在您輸入時直接讀取輸入。但是,您將無法使用Backspace
/Ctrl
+W
來編輯輸入,也無法使用Ctrl
+D
來結束輸入。如果您輸入:
$已保存=$(stty -g); stty -icanon icrnl;頭-n1 | 廁所-c; stty "$ 已保存"Enter
粘貼 5000 字節長的行並按
Enter
,您將看到 5001。