通常,bash 命令行会换行——我已经习惯了并且效果很好:
[cnd@MacBook-Pro ~]$ echo abcdefgABCDEFGhijklmnopHIJKLMNOPq
rsQRStuvTuvWXYZ
(我把窗口缩小来演示)
然而,默认的 CentOS8 shell 不再执行此操作。相反,它会截断您输入的大部分开头(一旦您到达终端宽度末尾的 3 个字符以内),将其替换为“">”,并且您将无法再看到您输入的内容。
[cnd@hpz ~]$
<EFGhijklmnopHIJKLMNOPqrsQRStuvTuvWXYZ
(从 shell 窗口实际复制/粘贴)
阻止这种令人恼火的行为的正确方法是什么?我需要查看整个命令(我输入了很多长的 Perl 语句 - 在运行之前进行检查很重要!)
我尝试过各种各样的事情,比如使用 vt100 或 xterm 作为终端,一些“set”命令和其他导出,但到目前为止我无法猜测,谷歌似乎没有任何答案(被不相关的问题污染)关于输出换行、不需要的滚动、ansi 转义提示转义等)
答案1
这是 GNU Readline 行输入编辑库的行为,并且在任何使用 Readline 的程序中都表现出来,而不仅仅是 Bourne Again shell。
如果 termcap/terminfo 数据库中的终端记录(由TERM
环境变量表示)没有提供向上移动光标的终端功能,则 Readline 会从多行模式回退到横向滚动的单行模式(在Korn shell 的时尚,它使用自己的行编辑库)。
确实,唯一的文档是隐藏在库源代码中的注释。
horizontal-scroll-mode
您还可以通过将 Readline 的变量设置为 on 来强制它回退到单行模式。但是,您不能强制它使用多行模式,除了通过提供功能齐全的 termcap/terminfo 记录。
讽刺的是,这种后备措施对于终端和终端仿真器来说非常重要,即使在 35 年前,终端和终端仿真器也很少见。行式打印机和dumb
终端首先不适合这种形式的行输入编辑。并且几乎每一个现代视频终端有一个向上移动光标的控制序列。
21 世纪更明智的方法是默认使用 ECMA-48 标准,该标准自 1976 年以来一直存在,并从 20 世纪 80 年代中期开始得到广泛支持,并制定dumb
(实际上是 1968 年的 TTY-37,参见glasstty
、vanilla
和tty37
)例外而不是默认。这将认识到,如今人们几乎永远不会遇到甚至是真正的 TTY-37,更不用说能够完成输入行编辑但缺乏光标向上控制序列的终端了。
GNU Readline 还没有做到这一点。
进一步阅读
- https://unix.stackexchange.com/a/196229/5132
- 乔纳森·德博因·波拉德 (2019)。 ”学期”。 杂项。诺什工具集。
- 乔纳森·德博因·波拉德 (2019)。 ”终端能力”。 C++ 库。诺什工具集。
- $TERM 如何以及在哪里解释?