嵌入式Linux使用bash的必要性
一直以来嵌入式ARM linux的默认shell多数是busybox自带的ash,该shell可以看做是bash的裁剪版本,仅支持bash的部分功能。虽然ash可以胜任日常嵌入式开发的绝大多数任务,但它缺失的一个功能导致我一直对它抱有不满,这个功能就是bash自带的按键绑定(bind)功能,以下.bashrc的配置是我在ubuntu开发环境的必备配置,这个配置带来的好处那真的是life change类型的,谁用谁知道!
# 加快历史命令搜索(键入几个命令开头字母,使用上翻建即可实现快速查找以这些字母开头的所有历史记录!)
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
bash存在的问题
为了能够实现在嵌入式开发板中也使用这个异常好用的特性,很早之前我就开始习惯于在开发板上交叉编译bash并将其设置为默认的shell使用。以前的开发板多数是带网口的,日常开发基本都是telnet/ssh远程登录到开发板终端,这种方式使用bash没有任何问题。
不过最近搞的几个项目的开发板全都没有带网口,导致我不得不在开发时使用串口登录到linux内核的console终端上进行日常开发调试。这么一用就弄了一个奇怪的问题,问题描述如下:
当bash作为console控制台的默认shell时,一条命令如果过长需要回绕时并不会自动换行并且总是会覆盖行首已经存在的字符, 截图如下:

箭头所示位置本应该要换行显示,现在的效果确是没有换行并且覆盖了同一行已经显示出的内容,这个问题恶心我了很久,也查了不少资料,一直都没有解决,只能这么蹩脚勉强着用,后来有一天我的强迫症终于战胜了懒惰症,我开始下定决心要把这个问题解决掉。
解决问题的思路最初是怀疑bash和readline库版本的问题,经过各种换版本编译折腾一波最终失败告终。后来又由于相同的环境下ash没有这个问题, 曾经一度想找个办法让ash支持bind命令以用回ash,后来也是以失败告终。实在没有办法了,开始在谷歌上使用英文查找可能的帖子。皇天不负有心人啊,最终在一个老外的论坛上找到了答案:
该问题是由于登录tty设备的的终端窗口大小和tty设置的行列不一致导致,修复了方法就是想办法让他们两个一致,可行的第一个解决方案如下:
- /etc/profile中设置并导出一个合理的终端大小:
export LINES=50 COLUMNS=150
- 设置登录终端的窗口大小和profile导出的大小一致。以xshell为例,在“文件” -> “当前会话属性” -> “终端” 选项卡中设置自动修正当前终端大小和profile中设置的值一致:

如果勾选了“连接时重置端子尺寸”则可以实现xshell在连接终端时自动将窗口大小修改到tty配置的大小,不过该方法会导致xshell在连接多个终端时总是切换窗口大小到最后一个连接的终端大小
另外如果不勾选这个自动设置窗口大小的选项,我们也可以选择将窗口大小通过鼠标拖拽的方式修正到和profile配置的大小一致来达到同样的效果!
后记:更加方便合理的方法
有一次在玩韦东山老师提供的rk3399开发板时偶然发现这个板子在启动并登陆到console控制台时总是会输出如下类似的日志:

凭借我敏锐的直觉,立刻意识到这是在自动导出tty的LINES和COLUMNS到和当前窗口一致的一个操作,经过一段按图索骥的追溯,最终让我找到该输出是一个叫做resize命令的输出,man 手册看一下resize命令:

很明显这个命令的功能就是重设终端的长宽参数到当前窗口大小,这简直就是为bash的这个问题量身打造的命令啊,那还等什么, 赶紧上马用起来!
于最终这个bash长行回绕的问题可以通过在/etc/profile中添加如下一个华丽的命令操作就可以完美的解决了:
# resize the tty lines and columns same to terminal windows size
# this option can fix bash long line warp at same line problam
resize
本文讨论了在嵌入式Linux中使用bash作为默认shell时,长命令行回绕导致覆盖行首的问题。通过分析问题原因,作者发现是终端窗口大小与tty设置不一致导致,并提供了解决方案:在/etc/profile中设置终端大小或使用resize命令自动调整。最后,作者分享了一个更方便的方法,即在启动时自动运行resize命令,完美解决bash的行回绕问题。

被折叠的 条评论
为什么被折叠?



