如果我通过串行适配器连接到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