Linux 终端输入:从终端截断行读取用户输入,限制为 4095 个字符

2024-11-04 08:43:00
admin
原创
285
摘要:问题描述:在 bash 脚本中,我尝试在设置后使用内置read命令从标准输入读取行`IFS=$''`。如果我将输入粘贴到读取中,行会在 4095 个字符的限制处被截断。此限制似乎来自从终端读取,因为这完全正常:fill= for i in $(seq 1 94); do fill=&...

问题描述:

在 bash 脚本中,我尝试在设置后使用内置read命令从标准输入读取行`IFS=$'
'`。如果我将输入粘贴到读取中,行会在 4095 个字符的限制处被截断。此限制似乎来自从终端读取,因为这完全正常:

fill=
for i in $(seq 1 94); do fill="${fill}x"; done
for i in $(seq 1 100); do printf "%04d00$fill" $i; done | (read line; echo $line)

我使用 Python 脚本时也遇到了同样的问题(不接受来自终端的长度超过 4095 的输入,但可以接受来自管道的输入):

#!/usr/bin/python

from sys import stdin

line = stdin.readline()
print('%s' % line)

即使 C 程序也可以同样工作,使用read(2)

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char buf[32768];
    int sz = read(0, buf, sizeof(buf) - 1);
    buf[sz] = '';
    printf("READ LINE: [%s]
", buf);
    return 0;
}

在所有情况下,我都无法输入超过 4095 个字符。输入提示停止接受字符。

问题 1:在 Linux 系统(至少是 Ubuntu 10.04 和 13.04)中,有没有办法从终端以交互方式读取超过 4095 个字符的内容?

问题 2:这个限制从何而来?

受影响的系统:我注意到 Ubuntu 10.04/x86 和 13.04/x86 中存在此限制,但 Cygwin(至少是最新版本)在超过 10000 个字符时不会截断(没有进一步测试,因为我需要让此脚本在 Ubuntu 中运行)。使用的终端:虚拟控制台和 KDE konsole(Ubuntu 13.04)和gnome-terminal(Ubuntu 10.04)。


解决方案 1:

请参阅termios(3)手册页的“规范和非规范模式”部分。

通常,终端(标准输入)处于规范模式;在此模式下,内核将在将输入返回给应用程序之前缓冲输入行。Linux 的硬编码限制(N_TTY_BUF_SIZE在 中定义${linux_source_path}/include/linux/tty.h)设置为 4096,允许输入 4095 个字符(不包括结束的新行)。您还可以查看文件${linux_source_path}/drivers/tty/n_tty.c、函数n_tty_receive_buf_common()和上面的注释。

在非规范模式下,默认情况下内核不会进行缓冲,一旦返回一个输入字符(按下键) ,read(2)系统调用就会立即返回。您可以操纵终端设置来读取指定数量的字符或为非规范模式设置超时,但根据termios(3)手册页(以及上述注释n_tty_receive_buf_common()),硬编码限制也是 4095。

Bashread内置命令在非规范模式下仍然有效,如下所示:

IFS=$'
'      # Allow spaces and other white spaces.
stty -icanon   # Disable canonical mode.
read line      # Now we can read without inhibitions set by terminal.
stty icanon    # Re-enable canonical mode (assuming it was enabled to begin with).

添加此修改后,您可以粘贴长度超过 4096 个字符的字符串并使用内置命令stty -icanon成功读取它(我成功尝试了长度超过 10000 个字符)。bash`read`

如果您将其放在一个文件中,即将其制作成脚本,则您可以使用它strace来查看被调用的系统调用,并且您将看到read(2)多次被调用,每次在您键入输入时都返回一个字符。

解决方案 2:

我没有为您提供解决方法,但我可以回答问题 2。在 Linux 中,PIPE_BUF 设置为 4096(在limits.h)如果您向管道写入超过 4096,它将被截断。

/usr/include/linux/limits.h

#ifndef _LINUX_LIMITS_H
#define _LINUX_LIMITS_H

#define NR_OPEN         1024

#define NGROUPS_MAX    65536    /* supplemental group IDs are available */
#define ARG_MAX       131072    /* # bytes of args + environ for exec() */
#define LINK_MAX         127    /* # links a file may have */
#define MAX_CANON        255    /* size of the canonical input queue */
#define MAX_INPUT        255    /* size of the type-ahead buffer */
#define NAME_MAX         255    /* # chars in a file name */
#define PATH_MAX        4096    /* # chars in a path name including nul */
#define PIPE_BUF        4096    /* # bytes in atomic write to a pipe */
#define XATTR_NAME_MAX   255    /* # chars in an extended attribute name */
#define XATTR_SIZE_MAX 65536    /* size of an extended attribute value (64k) */
#define XATTR_LIST_MAX 65536    /* size of extended attribute namelist (64k) */

#define RTSIG_MAX     32

#endif

解决方案 3:

问题肯定不是出在 read() 上,因为它可以读取任意有效的整数值。问题出在堆内存或管道大小上,因为它们是唯一可能限制大小的因素。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用