谁进行换行以及如何停用?

谁进行换行以及如何停用?

如果我通过串行适配器连接到Linux设备(无论是pyserial、screen还是minicom),并且无论我如何更改设置,例如stty当我输入长命令时,它都会换行(特别是输入空格和回车符) 。我在这方面的知识太少了,我什至不能称自己为初学者,但有可能是读取行的工具或shell解释器在换行吗?

同样,stty将 的大小更改为60 100根本没有改变换行发生的点。

外壳信息:

root@4020-1-00007:~# echo $SHELL
/bin/sh
root@4020-1-00007:~# ls -al /bin/sh 
lrwxrwxrwx    1 root     root             9 Jul 31 18:09 /bin/sh -> /bin/bash
root@4020-1-00007:~# bash --version
GNU bash, version 4.3.0(1)-release (arm-angstrom-linux-gnueabi)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

(不知道我如何找出选择了哪些构建选项)

答案1

shell 和终端都参与其中:您将使用的大多数终端都会自动换行。启动时,bash(在lib/readline/terminal.c) 检查与此相关的两个 termcap 标志:

  _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");

其中(参考术语信息(5))告诉它终端是否以 VT100(和相关终端)的特殊方式换行:

   auto_right_margin         am     am   terminal has automatic
                                         margins
   eat_newline_glitch        xenl   xn   newline ignored
                                         after 80 cols (concept)

Linux 控制台和 xterm 就是这种情况。当 bash 看到这一点时,它会在确定光标位于右边距时帮助换行(以避免换行故障问题),如所示显示.c:

  /* If we're at the right edge of a terminal that supports xn, we're 
     ready to wrap around, so do so.  This fixes problems with knowing 
     the exact cursor position and cut-and-paste with certain terminal 
     emulators.  In this calculation, TEMP is the physical screen 
     position of the cursor. */

同时,终端将在以下情况下换行(默认情况下):到达右边距。stty如果您的终端没有 100 列(并且终端不知道您告诉的内容stty),则使用将终端大小增加到 100 列不会有帮助。 bash 知道(或者应该知道,除非您设置了环境变量COLUMNS)。

但假设你的终端窗口实际上有 100 列......

如果 bash 对行长度感到困惑,它会以与 OP 注释相匹配的方式出现错误行为

最简单的例子是打开一个串行连接并输入一些键,直到线路已满,然后它就会损坏并且要么在下一行继续,要么在前面的同一行

这是几个错误报告的主题(应该是bash 常见问题解答,但唯一提到的方面是提示中非打印字符的问题)。

鉴于该评论,似乎存在这种联系“Linux设备通过连续剧适配器”used 无法可靠地告诉 shell 终端有多宽,因此默认为 80 列。

关于 busybox 的评论似乎偏离了目标,因为后续编辑显示实际的 shell 是 bash。但有关“串行适配器”的注释意味着您不会将窗口大小的事件传递到 shell。阅读 bash 的源代码,似乎在这种情况下,它只会在第一次初始化时获得有用的屏幕大小(bash 只执行_rl_get_screen_size最初,或响应 a SIGWINCH)。

但是你使用实际屏幕尺寸创建终端描述,并在子 shell 中使用它(当系统无法提供正确的屏幕尺寸时,bash 将使用该描述):

#!/bin/sh                                                           
infocmp -1 | \
sed     -e 's/^[^[:space:]].*|/fixed|/' \
        -e '/lines#/d' \
        -e '/cols#/d' \
        >foo
resize -u | awk '
/COLUMNS=/{ sub("COLUMNS=","cols#"); }
/LINES=/{ sub("LINES=","lines#"); }
/export/{ next; }
        { sub(";",","); printf "\t%s\n", $0; }
' >>foo
tic foo
TERM=fixedsize bash

答案2

它是终端仿真器进行换行。您可以通过向终端模拟器发送一些信息来关闭它控制序列:

关闭换行:

$ printf %b '\033[?7l'

打开换行:

$ printf %b '\033[?7h'

或使用输出:

关闭换行

$ tput rmam     

打开换行

$ tput smam

请参阅man 5 terminfo了解更多详情。

相关内容