终端不接受超过 1024 个字符的粘贴或键入行

终端不接受超过 1024 个字符的粘贴或键入行

当我在 OS X 终端的 stdin 上输入文本时,单行限制为 1024 个字符。例如,cat > /dev/null在我输入(或粘贴)比这更长的行后发出蜂鸣声,并且拒绝接受更多字符。一个有问题的例子是,当我想使用cat | wc -c:cat第一长行的块来计算粘贴文本中的字符数时。

这似乎是粘贴到标准输入的普遍问题。是否可以删除观察到的每行 1024 个字符的标准输入限制或将其推至更高的限制?

我需要这个,因为我想粘贴行长超过 1024 个字符的文本。

我还可以使用“heredoc”<< EOT并毫无问题地粘贴我的长行,但随后文本出现在我的 shell 历史记录中,这是我不想要的。

答案1

可能是终端设备行规则内部行编辑器缓冲区的限制。

您应该能够通过按Ctrl+D中间部分来输入长行(以便将当前输入的部分发送到cat并刷新行编辑器),或者完全禁用该行编辑器。

例如,如果使用zsh

STTY=-icanon cat > file

请注意,您将无法使用Backspace或任何其他编辑功能。您还需要按Ctrl-C停止 cat

与其他外壳:

s=$(stty -g); stty -icanon; cat > file

其次是:

stty "$s"

要不就:

stty -icanon; cat > file
stty sane

当然,像这样的事情

cat | wc -l

或者

wc -l

行不通的。因为Ctrl+C杀死了前台进程组中的所有进程。

你可以这样做:

STTY=-icanon cat | (trap '' INT; wc -l)

或者正如@mikeserv建议的:

STTY='eol " "' wc -l

这样,每次进入空间时缓冲区都会被刷新。您仍处于规范模式,因此仍然可以编辑(与线相对)并用于Ctrl+D表示 EOF。

或者:

STTY='-icanon min 0 time 30' wc -l

停止输入后 3 秒将出现 EOF。或者:

STTY=-icanon sed -n '/^EOF$/q;p' | wc -l

然后输入EOF(一行中的 3 个字母)结束输入。

作为吉尔斯建议,在可能的情况下(如一般不是例如,telnet/ssh 会话),使用pbpaste而不是粘贴。 (在 OSX 上;在 X11 下,调用xselxclip。):

pbpaste | wc -l

这也将避免^C复制粘贴缓冲区中可能存在的某些控制字符(例如 )的问题。

相关内容