Linux terminal input: reading user input from terminal truncating lines at 4095 character limit

前端 未结 3 1648
太阳男子
太阳男子 2020-12-03 14:27

In a bash script, I try to read lines from standard input, using built-in read command after setting IFS=$\'\\n\'. The lines are truncated at 4095

3条回答
  •  一生所求
    2020-12-03 14:58

    Please refer to termios(3) manual page, "Canonical and noncanonical mode".

    By default the terminal (standard input) is in canonical mode; in this mode the kernel will buffer the input line before returning the input to the application. The hard-coded limit for Linux (maybe N_TTY_BUF_SIZE defined in ${linux_source_path}/include/linux/tty.h) is set to 4096 allowing input of 4095 characters not counting the ending new line. In noncanonical mode there will by default be no buffering by kernel and the read(2) system call returns immediately once a single character of input is returned (key is pressed). You can manipulate the terminal settings to read a specified amount of characters or set a time-out for non-canonical mode, but then too the hard-coded limit is 4095 per the termios(3) manual page.

    Bash read builtin command still works in non-canonical mode as can be demonstrated by the following:

    IFS=$'\n'      # 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).
    

    After this modification of adding stty -icanon you can paste longer than 4096 character string and read it successfully using bash built-in read command (I successfully tried longer than 10000 characters).

    If you put this in a file, i.e. make it a script, you can use strace to see the system calls called, and you will see read(2) called multiple times, each time returning a single character.

提交回复
热议问题