Skip to content

LV010-默认终端长度

一、问题描述

这个问题是使用 Mobaxterm 连接正点原子 alpha imx6ull 开发板的的时候发现的,就是我们链接好串口后,敲一些很长的命令,它不会换行,会出现字符重叠、换行错误的情况, 非常影响使用感受,就像这样:

image-20241018223238406

即便我的终端已经开成了全屏。

二、问题原因

上面的问题是因为终端软件的换行长度与开发板串口终端长度不一致造成的,可在终端软件进行如下配置强制使用相同的换行长度,开发板默认的串口终端行长度为 80 个字符, 也可以使用命令stty size进行查看。

注意:如果使用的是 ssh 连接,那么终端与开发板的行长度是自动适应的,如果强制换行长度还会多此一举。

三、解决办法

1. 解决方式 1——修改 Mobaxterm 配置

我们打开串口的配置界面,找到字体设置,然后勾选这个强制固定:

serial_config.png

然后重新连接串口,就会变成这样:

image-20241018223847523

可以看到确实不会重叠了,但是观感极差。

2. 解决方式 2——修改开发板配置

我们打开开发板的/etc/init.d/rcS 文件,去掉这两行:

shell
shopt -s checkwinsize
resize

没有的话就不管了。然后打开环境变量文件/etc/profile,添加如下内容:

shell
shopt -s checkwinsize
resize

然后在开机的时候会有如下打印:

image-20241018225227302

然后我们再尝试输入超长的命令,就会发现一切正常。

image-20241018225316744

四、相关命令

1. shopt

shopt 命令是 set 命令的一种替代, 很多方面都和 set 命令一样, 但它增加了很多选项。通过执行 shopt 看看都有那些选项与系统的默认值。命令格式如下:

shell
shopt [-psu] [optname]

常用选项说明如下:

shell
-p 选项来查看shopt选项的设置
-u 表示关闭一个选项
-s 表示开启一个选项

我们可以在开发板的终端敲一下这个命令:

shell
root@ATK-IMX6U:~# shopt
autocd          off
# ......
checkwinsize    on
# ......
xpg_echo        off

里面一些常见的参数说明如下:

shell
cdable_vars   # 如果给 cd 内置命令的参数不是一个目录, 就假设它是一个变量名, 变量的值是将要转换到的目录
cdspell       # 纠正 cd 命令中目录名的较小拼写错误.检查的错误包括颠倒顺序的字符, 遗漏的字符以及重复的字符.如果找到一处需修改之处, 正确的路径将打印出, 命令将继续.只用于交互式 shell
checkhash     # bash 在试图执行一个命令前, 先在哈希表中寻找, 以确定命令是否存在.如果命令不存在, 就执行正常的路径搜索
checkwinsize  # bash 在每个命令后检查窗口大小, 如果有必要, 就更新 LINES 和 COLUMNS 的值
cmdhist       # bash 试图将一个多行命令的所有行保存在同一个历史项中.这是的多行命令的重新编辑更方便
dotglob       # Bash 在文件名扩展的结果中包括以点(.)开头的文件名
execfail      # 如果一个非交互式 shell 不能执行指定给 exec 内置命令作为参数的文件, 它不会退出.如果 exec 失败, 一个交互式 shell 不会退出
expand_aliases   # 别名被扩展.缺省为打开
extglob       # 打开扩展的模式匹配特性(正常的表达式元字符来自 Korn shell 的文件名扩展)
histappend    # 如果 readline 正被使用, 用户有机会重新编辑一个失败的历史替换
histverify    # 如果设置, 且 readline 正被使用, 历史替换的结果不会立即传递给 shell 解释器.而是将结果行装入 readline 编辑缓冲区中, 允许进一步修改
hostcomplete  # 如果设置, 且 readline 正被使用, 当正在完成一个包含@的词时 bash 将试图执行主机名补全.缺省为打开
huponexit     # 如果设置, 当一个交互式登录 shell 退出时, bash 将发送一个 SIGHUP(挂起信号)给所有的作业
interactive_comments   # 在一个交互式 shell 中.允许以#开头的词以及同一行中其他的字符被忽略.缺省为打开
lithist       # 如果打开, 且 cmdhist 选项也打开, 多行命令讲用嵌入的换行符保存到历史中, 而无需在可能的地方用分号来分隔
mailwarn      # 如果设置, 且 bash 用来检查邮件的文件自从上次检查后已经被访问, 将显示消息”The mail in mailfile has been read”
nocaseglob    # 如果设置, 当执行文件名扩展时, bash 在不区分大小写的方式下匹配文件名
nullglob      # 如果设置, bash 允许没有匹配任何文件的文件名模式扩展成一个空串, 而不是他们本身
promptvars   # 如果设置, 提示串在被扩展后再进行变量和参量扩展.缺省为打开
restricted_shell   # 如果 shell 在受限模式下启动就设置这个选项.该值不能被改变.当执行启动文件时不能复位该选项, 允许启动文件发现 shell 是否受限
shift_verbose # 如果该选项设置, 当移动计数超出位置参量个数时, shift 内置命令将打印一个错误消息
sourcepath   # 如果设置, source 内置命令使用 PATH 的值来寻找作为参数提供的文件的目录.缺省为打开
source       # 点(.)的同义词

2. resize

resize 命令设置终端机视窗的大小。执行 resize 指令可设置虚拟终端机的视窗大小。语法格式如下:

shell
resize [参数]

常用参数:

  • -c 就算用户环境并非 C Shell,也用 C Shell 指令改变视窗大小。

  • -s 设置终端机视窗的垂直高度和水平宽度。

  • -u 就算用户环境并非 Bourne Shell,也用 Bourne Shell 指令改变视窗大小。