当我在 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)
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 下,调用xsel
或xclip
。):
pbpaste | wc -l
这也将避免^C
复制粘贴缓冲区中可能存在的某些控制字符(例如 )的问题。