【问题标题】:what is the max number of characters 'read' command can take in one line“读取”命令在一行中最多可以包含多少个字符
【发布时间】:2017-05-03 11:52:29
【问题描述】:

我有以下 shell 脚本可以从终端读取行

#!/bin/bash

while read line
do
if [ -z ${line} ]
then
    break
fi
echo ${line}
done

我不能输入超过 256 个字符。终端不允许我这样做(终端不打印超过 256 个字符的任何内容,甚至不打印新行。它唯一允许的就是退格)

$ ./echo.sh
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

我正在使用 Solaris 10 操作系统 使用的终端是腻子 bash 版本 3.2.52

这是 bash 还是 putty 的限制?我知道将我的输入分成几行,但我需要知道是否有办法克服为读取命令输入的最大字符数作为输入

【问题讨论】:

  • @KrisRoofe - 您链接的问题是关于 命令行 的长度,而不是 read 命令的输入长度。虽然这可能是重复的,但我不认为它与您链接的问题重复。
  • @vibz,您使用的是什么操作系统和 bash 版本?我无法复制您遇到的问题。你能澄清一下“我不能进入”是什么意思吗?你有什么错误吗?如果是这样,什么错误?
  • 是的,正如@ghoti 所说,它是关于读取命令输入长度的限制,而不是关于可以输入的命令的最大长度
  • 顺便说一句,[ -z $line ] 并没有按照您的想法去做;请改用[ -z "$line" ]。当你的行变量为空时,[ -z $line ] 变为[ -z ],相当于[ -n -z ],所以完全错误的原因返回true。此外,如果设置了line='foo -o 1 = 1',当被测试的变量根本不为空时,你会看到一个真实的返回。 (这一类的bug会被shellcheck.net捕获;考虑习惯性地使用)。
  • @tripleee,建议的欺骗似乎是在处理命令行参数列表长度,而不是read 使用的终端内容。我错过了什么吗?

标签: bash shell unix


【解决方案1】:

这是操作系统终端驱动程序的限制。

我们通常认为这是理所当然的,但是当您输入hi<Backspace>ello 并按回车键时,该过程将显示为hello

终端驱动程序通过将该行存储在内存中,然后在您按 Backspace 时删除该缓冲区中的最后一个字符来实现这一点。 用于此的缓冲区具有一些人类规模的大小。在 Linux 上,它是 4096 字节,用于比较。

您可以通过禁用行编辑来解决此问题:

stty -icanon

read 现在将一次读取更多数据,但如果您按 Backspace,应用程序实际上将读取一个退格字符而不是最后一行。

【讨论】:

  • 感谢您的回复。但这引入了一个新问题。 Enter 现在被读取为一个字符,而 if [ -z ${line} ] 永远不会被执行,因此 while 循环永远不会终止
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多