我正在尝试使用 I/O 重定向,但在两个环境中,less 的行为有所不同。这两个环境都是基于 Solaris 的,并且是同一版本。
我在两个环境中执行程序,如下所示:
环境1:
script </dev/pts/1 >&/dev/pts/1 (/dev/pts/1 is my SSH session terminal)
环境2:
script </dev/console >&/dev/console (/dev/console is Solaris main console)
脚本如下:
#!/bin/bash
exec 4>>/tmp/script.log
export PS4='[\D{%FT%TZ}] $(tty): ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
export BASH_XTRACEFD=4
set -o xtrace
export TERM=xterm-color
file=/path/to/big/file
less -MQEX ${file}
read
在环境 1 中,一切正常,我可以控制 less 并上下滚动、退出等。在环境 2 中,less 仅显示文件的第一部分并退出,无法上下滚动或在文件内进行操作。环境 2 是一个脚本,它从 SMF 清单运行。我尝试过的事情:
尝试了各种 bash 选项(交互式和非交互式),但对此没有任何影响。在两种环境中,我都将以下 bash 选项 ($-) 设置为“hxB”。
设置不同的 TERM 类型不会影响较少的行为。我尝试过“xterm”、“vt100”和“vt220”。
我不确定我还应该尝试什么或在哪里查找。我应该如何继续调试 less 行为?任何提示都值得感激。
答案1
如果这真的索拉里斯控制台,它不兼容终端(或者任何事物与 VT100 相关)。VT100 使用转义序列进行滚动,这对 Sun 硬件来说非常有趣。
请参阅手册页韋斯康,任何在名称中用括号标有“SUN”的东西几乎都肯定是不兼容的。与 VT100 滚动控件一样,这些是转义序列,不属于“ANSI X3.64”的一部分(很久以前撤回,取而代之ECMA-48)。您的问题的根源是这个:
ESC[#r
设置滚动 (SUNSCRL)采用一个参数,n(默认 0)。设置为n一个内部寄存器,用于确定当光标位于底行时执行换行功能时屏幕向上滚动的行数。参数 2 或 3 会在滚动时引入少量跳跃。参数 34 会清除屏幕而不是滚动。重置时的初始设置为 1。
参数为零时将启动换行模式而不是滚动。如果在换行模式期间在底行发生换行,则光标将移至屏幕顶行的相同字符位置。当发生换行时,光标移动到的行将被清除,并且不会发生滚动。
ESC [ 1 r
退出并返回滚动模式。有关详细信息,请参阅上面的换行(CTRL-J)控制功能的描述。
VT100 风格的 CSR(改变滚动区域)采用两个参数,即滚动区域的起始行和结束行。