在 Linux 中粘贴到终端时,行长度是否有任何限制?

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 个字符之后直到(但不包括)任何终止换行符的任何输入数据都将被丢弃。这确保终端始终可以接收更多输入,直到可以读取至少一行。

另请参阅Linux 内核中相应代码

例如,如果您输入:

$ wc -cEnter

Enter在 shell 自己的行编辑器(在 bash 的情况下为 readline)中将行提交给 shell。当命令行完成时,shell 准备好执行它,所以它离开自己的行编辑器,将终端设备放回规范(又名煮熟)模式,这启用了粗略的行编辑器(实际上是在 tty 驱动程序中实现的)核心)。

然后,如果您粘贴 5000 字节的行,请按Ctrl+D提交该行,并再次告诉wc您已完成,您将看到4095输出。

(请注意,该限制不适用于bash自己的行编辑器,您会看到您可以在bashshell的提示下粘贴更多数据)。

因此,如果您的接收应用程序从其 stdin 读取输入行并且其 stdin 是终端设备,并且该应用程序没有实现自己的行编辑器(就像bash那样)并且没有更改输入模式,您将无法输入长度超过 4096 字节的行(包括终止换行符)。

但是,您可以stty -icanon在启动接收应用程序之前禁用终端设备的行编辑器(使用),以便在您输入时直接读取输入。但是,您将无法使用Backspace/ Ctrl+W来编辑输入,也无法使用Ctrl+D来结束输入。

如果您输入:

$保存=$(stty -g);stty -icanon icrnl; 头-n1 | wc -c; stty“$保存”Enter

粘贴 5000 字节长的行并按Enter,您将看到 5001。

  • @奥利维尔杜拉克。谢谢。在这一点上,它只是终端或终端仿真器(或 pty 的其他主端,如 expect、sshd 等)与内核对话。不涉及任何进程(及其 stderr)。内核所能做的就是将 BEL 字符例如发送回终端以提醒用户,但它没有(我已经添加了内核代码的链接),我想如果它通过锁定通信来做的话可能会适得其反与终端。您会看到它消耗但丢弃多余的输入,直到下一个换行符,以避免死锁情况。 (2认同)