Dim*_*ims 14 linux bash terminal putty truncate
我正在尝试从 发送消息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 "$@"
Run Code Online (Sandbox Code Playgroud)
然后我通过 Putty 终端粘贴消息。在接收端,我看到消息大约被截断到 4096 字节。我在卡夫卡的任何地方都没有看到设置了这个限制。
这个限制可以来自 bash/terminal 或 Putty 吗?
Sté*_*las 22
4095 是 Linux 上 tty 行规则内部编辑器长度的限制。从termios(3)
手册页:
- 最大行长度为 4096 个字符(包括终止换行符);超过 4096 个字符的行将被截断。在 4095 个字符之后,输入处理(例如,ISIG 和 ECHO* 处理)继续,但在 4095 个字符之后直到(但不包括)任何终止换行符的任何输入数据都将被丢弃。这确保终端始终可以接收更多输入,直到可以读取至少一行。
例如,如果您输入:
$ wc -cEnter
Enter在 shell 自己的行编辑器(在 bash 的情况下为 readline)中将行提交给 shell。当命令行完成时,shell 准备好执行它,所以它离开自己的行编辑器,将终端设备放回规范(又名煮熟)模式,这启用了粗略的行编辑器(实际上是在 tty 驱动程序中实现的)核心)。
然后,如果您粘贴 5000 字节的行,请按Ctrl+D提交该行,并再次告诉wc
您已完成,您将看到4095
输出。
(请注意,该限制不适用于bash
自己的行编辑器,您会看到您可以在bash
shell的提示下粘贴更多数据)。
因此,如果您的接收应用程序从其 stdin 读取输入行并且其 stdin 是终端设备,并且该应用程序没有实现自己的行编辑器(就像bash
那样)并且没有更改输入模式,您将无法输入长度超过 4096 字节的行(包括终止换行符)。
但是,您可以stty -icanon
在启动接收应用程序之前禁用终端设备的行编辑器(使用),以便在您输入时直接读取输入。但是,您将无法使用Backspace/ Ctrl+W来编辑输入,也无法使用Ctrl+D来结束输入。
如果您输入:
$保存=$(stty -g);stty -icanon icrnl; 头-n1 | wc -c; stty“$保存”Enter
粘贴 5000 字节长的行并按Enter,您将看到 5001。